为什么使用StopIteration Exception实现迭代的结束

jan*_*jan 4 python error-handling iterator exception

在查看Stackoverflow时 - 关于何时引发异常以及何时简单地返回NonePython函数的问题,新出现的图片是您应该使用异常来表示意外行为,None否则返回.

但是,迭代的for循环是通过方法StopIteration引发的Exception 实现的next(),尽管最终到达iterable的"end"通常并不意外.为什么for循环迭代迭代实现的方式是什么?

Fun*_*ayu 5

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

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

  • 更重要的是,在使用`yield from`语法的嵌套生成器的情况下简单地传播错误可能更容易,以指示源生成器的耗尽. (2认同)