最佳答案
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/