Python生成器与yield:如何在while循环中逐次调用next()完成迭代
问题解答
关于+=操作符能否推进生成器迭代的说明
- Python生成器对象没有实现
__iadd__等加法相关魔术方法,不能通过+=操作符推进迭代进度 - 生成器的内部迭代状态仅能通过
next()函数显式调用,或者for循环隐式调用next()来自动更新,无需额外操作手动修改状态
错误代码原因分析
你编写的循环存在两个核心问题:
- 生成器实例
seq在while循环内部创建,每次循环都会生成一个全新的、状态归零的生成器,所以每次调用next()都只会返回第一个值 - 没有设置循环终止条件,会进入无限循环
正确while循环实现
版本1:仅输出前4个值(和原代码输出完全一致)
def get_sequence_upto(x): for i in range(x): yield i seq = get_sequence_upto(5) count = 0 while count < 4: print(next(seq)) count += 1
注:此处count += 1仅用于循环次数计数,和生成器迭代推进无关
版本2:输出生成器全部可用值
def get_sequence_upto(x): for i in range(x): yield i seq = get_sequence_upto(5) while True: try: print(next(seq)) # 生成器迭代完成会抛出StopIteration异常,捕获后终止循环 except StopIteration: break
这个版本会完整输出0、1、2、3、4共5个生成器返回值。
内容的提问来源于stack exchange,提问作者Leo Optimo II
相关产品推荐
相关产品推荐

