Python生成器循环中断后next()调用跳过值的原因咨询
Python生成器break后调用next()跳过值的原因
问题重现
示例代码:
from itertools import cycle def endless(): yield from cycle((9,8,7,6)) total=0 e = endless() for i in e: if total<30: total += i print(i, end=" ") else: print() print("Reached the goal!") break print(next(e), next(e), next(e))
实际输出:
9 8 7 6 Reached the goal! 8 7 6
预期输出:
9 8 7 6 Reached the goal! 9 8 7
原因分析
问题出在Python的for循环对生成器的迭代逻辑上:
- 每次
for循环迭代时,会先调用next()从生成器取出下一个值,再把这个值赋值给变量i,之后才执行循环体内的判断和操作。 - 当
total累加完6后,total的值是30,达到退出条件的临界值。此时下一次循环启动,for会先调用next()从生成器取出下一个值(也就是循环序列的下一个元素9),然后才判断total<30——此时total是30,不满足条件,于是直接执行break退出循环,这个已经被取出的9就被直接丢弃,没有任何处理。 - 之后再调用
next(e)时,生成器会返回再下一个值8,所以后续三次next()得到的就是8、7、6,最终输出和预期不符。
内容的提问来源于stack exchange,提问作者knightcool
相关产品推荐
相关产品推荐

