我很好奇在生成器中使用raise StopIteration
和return
语句有什么不同。
例如,这两个函数之间有什么区别吗?
def my_generator0(n):
for i in range(n):
yield i
if i >= 5:
return
def my_generator1(n):
for i in range(n):
yield i
if i >= 5:
raise StopIteration
我猜更"pythonic“的方法是第二种方法(如果我错了,请纠正我),但据我所知,这两种方法都会引发StopIteration
异常。
发布于 2013-01-06 23:56:44
不需要显式地引发StopIteration
,因为这就是一个空的return
语句对生成器函数所做的事情-所以它们是相同的。但事实并非如此,仅仅使用return
更像是Pythonic式的。
来自:http://docs.python.org/2/reference/simple_stmts.html#the-return-statement (对Python3.2有效)
在生成器函数中,不允许return语句包含expression_list。在该上下文中,一个空的返回值表示生成器已完成,并将导致StopIteration被引发。
或者就像@Bakuriu指出的那样-- Python 3.3中生成器的语义发生了细微的变化,因此下面的描述更合适:
在生成器函数中,
语句指示生成器已完成,并将导致StopIteration被引发。返回值(如果有)用作构造StopIteration的参数,并成为StopIteration.value属性。
发布于 2015-05-13 22:23:41
截至2014年底,return
是正确的,用于结束发电机的raise StopIteration
正在折旧计划中。有关详细信息,请参阅PEP 479。
摘要
这个PEP提出了对生成器的更改:当在生成器中引发StopIteration
时,它将被替换为RuntimeError
。(更准确地说,当异常即将从生成器的堆栈框架中冒出来时,就会发生这种情况。)因为更改是向后不兼容的,所以最初使用__future__
语句引入该特性。
验收
此PEP已于…年11月22日被BDFL接受
基本原理
生成器和StopIteration之间的交互目前有些令人惊讶,并且可以隐藏隐蔽的bug。意外的异常不应导致细微的行为更改,而应导致嘈杂且易于调试的回溯。目前,在生成器函数中意外引发的StopIteration将被驱动生成器的循环构造解释为迭代的结束。
…
发布于 2013-01-07 00:00:17
这是真的,它们是等价的,除了一个是可读的,而另一个是晦涩的。这可以追溯到生成器的第一个版本(PEP255,在"Specification: Return“下),随后的增强(例如协程)不会改变这一点。3.3的yield from
(PEP380)将其扩展到return <expr>
,作为raise StopIteration(<expr>)
的语法糖,但这并没有改变return;
的含义。
https://stackoverflow.com/questions/14183803
复制相似问题