https://www.cnblogs.com/xybaby/p/6322376.html
【搬运】generator有以下特点:
1、遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
2、能过多次进入、多次返回,能够暂停函数体中代码的执行
https://blog.youkuaiyun.com/qq_33472765/article/details/80839417
【搬运】当你使用一个yield的时候,对应的函数就是一个生成器了。生成器的功能就是在yield的 区域进行迭代处理。
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。
重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。
https://blog.youkuaiyun.com/weixin_40247263/article/details/81561918
【搬运】当我们在一个方法中执行到return,如果 return后面还需要计算,那么计算完以后方法就会执行完毕。
但是如果方法中包含yield关键字,那么它就不再是一个方法了,而是一个generator对象。
即我们需要使用next()才能让它运行,并且每当遇到yield关键字,会打印出yield关键字后面的内容,并暂停于当前位置。
当我们再次调用next()方法,会从当前位置继续向下执行,再配到yield关键字还是输出、暂停。
【搬运】把列表生成式 外侧的中括号换成小括号 返回的结果就成 list变成了generator。
然后通过 next(generator) 就可以每调用一次 这个方法,就读取出一个值。
XR测试:
https://blog.youkuaiyun.com/tenderzhe/article/details/73480561
【搬运】
f=generator_function(5) f.next()
出现下面的错误
Traceback (most recent call last): File “<pyshell#32>”, line 1, in
<module>
f.next() AttributeError: ‘generator’ object has no attribute ‘next’原因是在python 3.x中
generator(有yield关键字的函数则会被识别为generator函数)中的next变为__next__了,next是python
3.x以前版本中的方法修改为下面这样运行正常
f=generator_function(5) f.__next__()
https://blog.youkuaiyun.com/weixin_40247263/article/details/81561918
【搬运】可以看出如果通过调用next()方法,最后没有值了,报出StopIteration异常,且我们的方法有返回值,python会将我们的返回值放入这个StopIteration这个对象的value属性中。
g = func()
while True:
try:
x = next(g)
print('g:',x)
except StopIteration as e:
print('Generator return value:',e.value)
break