【Python】generator yield详解

本文详细解析Python中的生成器generator及其yield关键字。生成器遵循迭代器协议,能在遇到yield时暂停并返回值,下一次迭代从yield之后的代码继续执行。通过next()方法调用生成器,每次调用读取一个值。在Python 3.x中,需使用__next__()代替next()。当生成器无值可返回时,会抛出StopIteration异常,且可将返回值放入异常的value属性中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值