Python生成器yield行为疑问:为何输出出现None?
生成器函数输出None的原因解析
先看你提供的生成器代码:
def gen(n=5): for i in range(n): n = yield n for i in gen(3): print(i)
运行结果:
3 None None
你对第一个输出3的理解没问题:调用gen(3)时,参数3赋值给函数内的n,进入for i in range(3)循环(这个循环会执行3次,因为range(3)对应0、1、2三个迭代值)。
后续两个None的具体由来:
- 第一次循环执行
n = yield n时,先执行yield n,把当前n的3返回,这就是第一个输出。此时生成器暂停,等待外部传入值。 - for循环迭代生成器的机制是:每次获取
yield返回的值后,会自动向生成器发送None。所以当生成器恢复执行时,yield n这个表达式的结果就是None,并被赋值给变量n。 - 第二次循环时,
n已经是None,执行yield n就会返回None,对应第二个输出。之后for循环再次发送None给生成器,n继续被赋值为None。 - 第三次循环执行
yield n,返回的还是None,也就是第三个输出。循环执行完3次后,生成器终止,for循环结束。
你的猜测是对的,本质就是for循环会默认给生成器发送None,这个值被赋值给了n,导致后续yield返回的都是None。
内容的提问来源于stack exchange,提问作者CyberPlayerOne
相关产品推荐
相关产品推荐

