Python 为什么迭代结束时会出现StopIteration异常

Python 为什么迭代结束时会出现StopIteration异常,python,exception,error-handling,iterator,Python,Exception,Error Handling,Iterator,当查看有关何时在Python函数中引发异常以及何时仅返回None的Stackoverflow问题时,新出现的情况是,您应该将异常用于意外行为,否则返回None 但是,对于iterable上的循环,可以通过next()方法引发的StopIteration异常来实现,尽管最终到达iterable的“结尾”通常并不意外。为什么iterables上的for循环会以这种方式实现?总体答案是您不能使用sentinel值来安全地声明迭代器/生成器的结束。简单地想象一下,您有一个None对象列表,None不能再

当查看有关何时在Python函数中引发异常以及何时仅返回
None
的Stackoverflow问题时,新出现的情况是,您应该将异常用于意外行为,否则返回
None


但是,对于iterable上的循环,可以通过
next()
方法引发的
StopIteration
异常来实现,尽管最终到达iterable的“结尾”通常并不意外。为什么iterables上的for循环会以这种方式实现?

总体答案是您不能使用sentinel值来安全地声明迭代器/生成器的结束。简单地想象一下,您有一个
None
对象列表,
None
不能再用作哨兵值。这就是为什么要使用
StopIteration
:没有哨兵值,问题就避免了


如果要避免此行为并在
next
中返回默认值,只需调用
next(generator,None)

即可获得循环迭代器/生成器,而不仅仅是iterables。所有迭代器都是可迭代的,但反过来并不总是正确的。更重要的是,在使用
生成语法的嵌套生成器的情况下,可能更容易传播错误,表示源生成器已耗尽。@MosesKoledoye:
在决定使用
StopIteration
时,从
产生的收益不存在。见鬼,生成器当时根本不存在。而且,
yield from
不会传播
StopIteration
。它捕获异常并使用异常的
作为
表达式的
产量的值。@user2357112感谢您的清除。必须返回阅读
语法中的
屈服。我认为错误仍然是间接传播的,因为子生成器中的StopIteration会触发委托中的
StopIterator