首页 > 其他分享 >12.迭代器 与 生成器

12.迭代器 与 生成器

时间:2024-04-23 12:34:51浏览次数:30  
标签:12 迭代 res 生成器 yield next num print

【一】迭代器

1)概念

迭代器用来迭代去取值的工具,迭代是反复取值的过程

每一次迭代返回的结果是下一次开始的初始值

2)可迭代对象

内置有 iter()的方法的对象都是可迭代对象

num= [1,2,3]
print(num.__iter__()) 
#<list_iterator object at 0x000001F3C5589420>
  • 可迭代对象
    • 字符串、列表、字典、元组、集合
  • 不可迭代对象
    • 整数、浮点数、布尔

3)迭代器对象

内置有iter()和next()方法的对象

num = [1, 2, 3]
num_iter = iter(num)
print(next(num_iter))	#1
print(next(num_iter))	#2
  • 迭代器对象
    • 字符串、列表、字典、元组、集合

4)迭代器的优缺点

1.优点

  • 不使用索引取值,字典不支持索引取值
  • 取到这个值的时候就会保存到当前的状态,下一次从这个位置开始向取值

2.缺点

  • 除非取尽,否则永远不知道终止索引在哪
  • 只能取下一个值,无法返回开头
  • 调用next取值的前提是已经生成并且得到了一个迭代器对象
  • 迭代同一个对象只能重新创建

【二】生成器

1)概念

特殊的迭代器,可以在需要时生成数据,可逐个生成列表中的元素

2)生成器的创建方式

1.列表推导式

print([i for i in range(10)])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 元组推导式 就是 生成器对象
print((i for i in range(10)))  
# <generator object <genexpr> at 0x0000016EDEFDA4D0>

2.yield关键字

def add():
    i = 0
    while True:
        i += 1
        yield i
res = add()
print(next(res))  # 1
print(next(res))  # 2
print(next(res))  # 3
print(next(res))  # 4

3.yield关键字使用

def unm():
    print('***')
    while True:
       numbers = yield
       print(f'数字:{numbers}')
res = unm()
print(res) #<generator object unm at 0x0000023B843A9700>
print(next(res))
# ***
# none
print(next(res))
# 数字:None
# None
def unm():
    print('***')
    while True:
        numbers = yield
        print(f'数字:{numbers}')
res = unm()
next(res)
res.send(1)
res.send(2)
res.send(3)
# ***
# 数字:1
# 数字:2
# 数字:3

4.yield + next 搭配使用

def num_range(start, stop, step):
    print('start')
    while start < stop:
        yield start
        start += step
    print('end')
res = num_range(0,3,1)
try:
    while True:
        print(next(res))
except:
    ...
# start
# 0
# 1
# 2
# end

标签:12,迭代,res,生成器,yield,next,num,print
From: https://www.cnblogs.com/Mist-/p/18152610

相关文章

  • 推荐蓝牙对讲机内部PA+SW组合电路-CB5337+CBS8112
    CB5337是完整的2.4GHz802.11axWLANRF前端模块(FEM)。包含一个2.4GHz单刀双投(SPDT)发射/接收(T/R)开关,一个2.4GHz低噪声放大器(LNA),以及一个应用于大功率802.11ax2.4GHz功率放大器(PA),非标最高可提供33dbm发射增益和14dbm接收增益;CB5337提供了完整的2.4GHzWLAN射频解决方案,从......
  • mybatis-plus 代码生成器步骤
    mybatis-plus代码生成器步骤:1.添加依赖到pom.xml<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version></dependency>&l......
  • JTCR-泛型-12
    什么是泛型具有参数化类型的类、接口或方法。具体的类型在运行时才确定。在泛型出现前通过使用Object引用也可以达到泛型的效果,但是缺乏类型安全检查,泛型添加了这一点。简单的泛型例子//T是类型参数,作为实际类型的占位符classGen<T>{Tv;Gen(To){v=o;......
  • Integer超过128要用对象比较,否则出问题
    一、测试代码publicvoidtestEquals(){intint1=12;intint2=12;Integerinteger1=newInteger(12);Integerinteger2=newInteger(12);Integerinteger3=newInteger(127);Integera1=127;//或者写成Integera1=Integ......
  • k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
    前言在搭建好kubernetes环境后,master节点拥有control-plane权限,可以正常使用kubectl。但其他node节点无法使用kubectl命令,即使同步过去/root/.kube/config文件到各个node节点上,也不行。解决检查KUBECONFIG变量:确保KUBECONFIG环境变量正确设置。KUBECONFIG......
  • C++ 上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的方法
    前言本人一直从事C++上位软件开发工作较多,在之前的项目中通过C++访问西门子PLCS7-200/S7-1200/S7-1500并进行数据交互的应用中一直使用的是ModbusTCP/ModbusRTU协议进行。Modbus上位开源库采用的LibModbus。经过实际应用发现Modbus开源库单次发送和接受的数据不能超......
  • 视野修炼-技术周刊第81期 | Chrome 124 新功能
    欢迎来到第81期的【视野修炼-技术周刊】,下面是本期的精选内容简介......
  • 23201228-第一次Blog
    一、前言:从大一下学期开始学习java到现在,已经完成了三次PTA用java实现的大作业,三次PTA作业的难度在逐渐增大,每次最后一题都是从第一次PTA大作业里迭代而来,难度很大且每次提升,涉及的内容有很多,比如类,方法,Arraylist等,但最主要的还是类的设计,通过这三次作业,很深刻的认识的了设计对于......
  • web server apache tomcat11-12-SSL/TLS Configuration
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目从零手写实现tomcatminicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserverapachetomcat11-02-setup启动web......
  • 4.2122数学强基
    4.2021数学强基椭圆一\(MF_1=r,MF_2=2a-r\)\((x+c)^2+y^2=r^2,(x-c)^2+y^2=(2a-r)^2\)分别以两个定点为圆心半径和为定值动圆交点轨迹二\(MF_1=a+m_0-r,MF_2=a-m_0+r\),\(m_0\)为定值\(\sqrt{(x+c)^2+y^2}=a+m_0-r,\sqrt{(x-c)^2+y^2}=a-m_0+r\)\((X+c)^2+Y^2=(a+m_0)^2,......