Python 为什么迭代结束时会出现StopIteration异常
当查看有关何时在Python函数中引发异常以及何时仅返回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不能再
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
。