Python生成器send方法迭代时值缺失问题求助
为什么生成器send(20)后20没有出现在输出中?
这是因为**send()方法返回的yield值没有被你捕获并打印**,而for循环只处理它自身调用next()时得到的结果。咱们一步步拆解你的代码执行过程,就能明白问题所在:
先回顾你的生成器逻辑
def GenInter(x, y): while (x+1 < y): callback = (yield x) # 暂停在这里,返回x;恢复时接收send的值到callback if callback is not None: x = callback else: x += 1
详细执行流程(对应你的for循环场景)
假设你的for循环代码是这样的(根据输出推测):
myGen = GenInter(10,25) for num in myGen: print(num, end=' ') if num ==15: myGen.send(20)
咱们一步步走:
- 第一次
next(myGen)(for循环自动触发):生成器执行到yield 10,返回10,for循环打印10,生成器暂停在callback = (yield x)这行。 - 后续每次
next():生成器恢复,callback为None(因为是next()调用),x自增1,然后yield新的x,直到: - 当
num=15被打印后,你调用myGen.send(20):- 生成器从暂停处恢复,
callback被赋值为20,于是x=20。 - 回到while循环判断:
20+1 <25成立,执行callback = (yield 20)——此时生成器暂停,并把20作为send()方法的返回值返回。但你没有打印这个返回值,所以20没出现在输出里。
- 生成器从暂停处恢复,
- for循环继续自动调用
next(myGen):- 生成器恢复,callback为
None,x自增1变成21,然后yield21,for循环打印21,之后继续直到循环结束。
- 生成器恢复,callback为
如何让20出现在输出中?
你需要捕获send()的返回值并打印,修改后的循环代码如下:
myGen = GenInter(10,25) for num in myGen: print(num, end=' ') if num ==15: # 捕获send返回的20并打印 sent_value = myGen.send(20) print(sent_value, end=' ')
这样输出就会变成:10 11 12 13 14 15 20 21 22 23
关键知识点总结
generator.send(value)的作用有两个:把value传入生成器作为yield表达式的结果,同时触发生成器执行到下一个yield,并返回该yield的值。- for循环是通过反复调用
next(generator)来获取值的,它不会处理send()返回的结果,所以如果需要这个值,必须手动捕获并处理。
内容的提问来源于stack exchange,提问作者Nico Desh
相关产品推荐
相关产品推荐

