【问题标题】:Why is the end of an iteration realized with a StopIteration Exception为什么使用 StopIteration 异常实现迭代的结束
【发布时间】:2018-04-12 23:31:55
【问题描述】:

查看 Stackoverflow-关于何时引发异常以及何时在 Python 函数中简单地返回 None 的问题时,出现的情况是您应该使用异常处理意外行为,否则返回 None

然而,可迭代对象上的 for 循环是通过 next() 方法引发的 StopIteration 异常实现的,尽管最终到达可迭代对象的“结束”通常并不意外。为什么 for-loop over iterables 是这样实现的?

【问题讨论】:

  • For 循环遍历迭代器/生成器,而不仅仅是迭代器。所有的迭代器都是可迭代的,但反过来并不总是如此。

标签: python exception error-handling iterator


【解决方案1】:

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

如果您想避免这种行为并在next 中返回一个默认值,您可以简单地调用next(generator, None)

【讨论】:

  • @MosesKoledoye:不过,当决定使用StopIteration 时,yield from 并不存在。哎呀,当时根本不存在发电机。
  • 另外,yield from 不会传播 StopIteration。它捕获异常并使用异常的value 作为yield from 表达式的值。
  • @user2357112 感谢您解决这个问题。不得不回去阅读yield from语法的formal semantics。我认为错误仍然是间接传播的,因为子生成器中的 StopIteration 会触发委托中的 StopIterator
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2018-04-13
  • 1970-01-01
  • 2011-03-13
  • 2012-09-24
  • 2016-01-30
相关资源
最近更新 更多