python - 为什么 next 会引发 'StopIteration' ,但 'for' 会正常返回?

最佳答案

for循环监听 StopIteration明确地。
for的目的语句用于循环迭代器提供的序列,异常用于表示迭代器现在已完成; for不会捕获被迭代对象引发的其他异常,只有那个异常。

那是因为 StopIteration是正常的、预期的信号,告诉正在迭代的人没有什么可产生的了。

生成器函数是一种特殊的迭代器;它确实引发了StopIteration当函数完成时(即当它返回时,是的, return None 引发 StopIteration )。这是迭代器的要求;他们必须筹集StopIteration当他们完成时;事实上,曾经是StopIteration已引发,尝试从它们获取另一个元素(通过 next() ,或调用迭代器上的 .next() (py 2) 或 .__next__() (py 3) 方法)必须始终引发 StopIteration再次。
GeneratorExit在另一个方向上进行通信是一个异常(exception)。您正在使用 yield 显式关闭生成器表达式,以及 Python 将闭包传达给生成器的方式是通过引发 GeneratorExit在那个函数里面。您在 countdown 中明确捕获该异常,其目的是让生成器在关闭时根据需要清理资源。

一个 GeneratorExit不会传播给调用者;见 generator.close() documentation .

关于python - 为什么 next 会引发 'StopIteration' ,但 'for' 会正常返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14413969/

posted @ 2021-10-19 23:58  狼太白  阅读(343)  评论(0编辑  收藏  举报