stopiteration是生成器正常终止的标准信号,由函数自然结束或显式return触发,用于通知迭代完成;它在next()/send()无更多yield时抛出,for循环自动捕获,而裸调next需手动处理。

StopIteration 不是 bug,是生成器“说完了”的标准信号。 它在生成器函数执行完毕、或显式遇到 return(含带值的 return)时自动触发,属于迭代器协议的正常终止机制。
StopIteration 在生成器中怎么被触发
生成器对象本质是迭代器,每次调用 next() 或 send() 都会推进到下一个 yield;当再无可推进的 yield 语句,且函数体自然结束(或遇到 return),Python 就抛出 StopIteration。
- 函数末尾隐式
return→ 触发StopIteration - 显式写
return "done"→ 触发StopIteration(value="done")(PEP 479 后 value 可被访问) - 生成器内部用
yield from委托另一个生成器,对方耗尽后也会向上冒泡StopIteration - 注意:
yield表达式本身不触发它,是“没得 yield 了”才触发
为什么手动调用 next() 时容易崩
因为 for 循环会自动捕获 StopIteration 并退出,但直接写 next(gen) 不会——它原样抛出异常,未处理就中断程序。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 错误写法:
while True: print(next(gen))→ 第一次耗尽就报错 - 正确做法一:
try: ... except StopIteration: break - 正确做法二:
next(gen, None)提供默认值,避免异常(但要注意None是否与合法数据冲突) - 别用
next(gen)在不确定长度的场景下裸奔
生成器 send() 调用后也抛 StopIteration?
会。只要生成器已终止,后续任何 send()、next()、throw() 都会立即引发 StopIteration(或 RuntimeError,取决于上下文和 PEP 479 状态)。
- 典型错误:
gen = my_gen(); gen.send("first"); gen.send("second")—— 如果生成器只 yield 一次,第二次 send 就触发异常 - 不能靠 try/except StopIteration 来“重启”生成器:生成器一旦终止,不可恢复
- 如果需要多次使用,应重新调用生成器函数创建新对象:
gen1 = my_gen(); gen2 = my_gen()
最容易被忽略的一点:你在生成器内部用 yield from subgen,而 subgen 提前耗尽,此时外层生成器未必立刻终止——但若外层没后续 yield,它就会在下一次 next 时抛 StopIteration,这个延迟触发常让人误以为是子生成器的问题。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










