本文共 1518 字,大约阅读时间需要 5 分钟。
生成器基本概念
1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束
2 生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存,所以生成器可以用在需要节省内存的场景
3 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数
4 next( generator object) 可以用于获取生成器返回的值
例子
def test():
i = 0
while True:
yield i
i += 1
I = test()
print (next(I))
print (next(I))
也可以用下面方式迭代,效果一样
print( I.next() )
print( I.next() )
注意: 直接
print( next(test()) )
print ( next(test()) )
是错误的,因为是俩个实例,所以输出都会是0
yield 与 return
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。
如果在return后返回一个值,那么这个值为StopIteration异常的说明,不是程序的返回值
def test():
i = 0
while True:
yield i
i += 1
if i > 5:
break
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
输出
0
1
2
3
4
5
Traceback (most recent call last):
File "C:\string.bak.py", line 31, in
print( I.next() )
StopIteration
生成器支持的方法
>>>help(odd_num)
Helpon generator object:
odd=classgenerator(object)
|Methods defined here:
......
|close(...)
|close()->raiseGeneratorExitinside generator.
|
|send(...)
|send(arg)->send'arg'into generator,
|returnnextyielded value orraiseStopIteration.
|
|throw(...)
|throw(typ[,val[,tb]])->raiseexceptioningenerator,
|returnnextyielded value orraiseStopIteration.
......
close方法
手动关闭生成器函数,后面的调用会直接返回StopIteration异常
next方法
对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。
然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,
后面再次调用next,依次类推
转载地址:https://blog.csdn.net/weixin_40006779/article/details/110275137 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!