【Python】generator yield详解

https://www.cnblogs.com/xybaby/p/6322376.html

【搬运】generator有以下特点:

1、遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
2、能过多次进入、多次返回,能够暂停函数体中代码的执行

https://blog.csdn.net/qq_33472765/article/details/80839417
【搬运】当你使用一个yield的时候,对应的函数就是一个生成器了。生成器的功能就是在yield的 区域进行迭代处理。
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。
重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。

https://blog.csdn.net/weixin_40247263/article/details/81561918
【搬运】当我们在一个方法中执行到return,如果 return后面还需要计算,那么计算完以后方法就会执行完毕。
但是如果方法中包含yield关键字,那么它就不再是一个方法了,而是一个generator对象。
即我们需要使用next()才能让它运行,并且每当遇到yield关键字,会打印出yield关键字后面的内容,并暂停于当前位置。
当我们再次调用next()方法,会从当前位置继续向下执行,再配到yield关键字还是输出、暂停。

【搬运】把列表生成式 外侧的中括号换成小括号 返回的结果就成 list变成了generator。
然后通过 next(generator) 就可以每调用一次 这个方法,就读取出一个值。

XR测试:
【Python】generator yield详解_第1张图片
https://blog.csdn.net/tenderzhe/article/details/73480561
【搬运】

f=generator_function(5)
f.next()

出现下面的错误

Traceback (most recent call last): File “”, line 1, in

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.csdn.net/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

你可能感兴趣的:(Python,Python,generator,yield,next)