You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:09:55