Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成器中的raisestopIteration和return语句有什么区别?_Python_Generator_Stopiteration - Fatal编程技术网

Python 生成器中的raisestopIteration和return语句有什么区别?

Python 生成器中的raisestopIteration和return语句有什么区别?,python,generator,stopiteration,Python,Generator,Stopiteration,我很好奇在生成器中使用raisestopIteration和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:

我很好奇在生成器中使用
raisestopIteration
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
异常。

没有必要显式地引发
StopIteration
,因为这是纯
return
语句对生成器函数所做的,所以它们是相同的。但是不,仅仅使用
return
更具python风格

From:(对Python 3.2有效)

在生成器函数中,return语句不允许包含表达式列表。在该上下文中,一个空返回表示生成器已完成,并将引发StopIteration

或者正如@Bakuriu所指出的,Python 3.3中生成器的语义稍有改变,因此以下内容更合适:

在生成器函数中,return语句表示生成器已完成,并将引发StopIteration。返回值(如果有)用作构造StopIteration的参数,并成为StopIteration.value属性


这是真的,它们是等价的,除了一个是可读的,而另一个是模糊的。这可以追溯到生成器的第一个版本(PEP 255,在“Specification:Return”下),而的后续增强(例如协同路由)并没有改变这一点。3.3从(PEP 380)获得的
收益扩展到
返回
,作为
提升停止迭代()
的语法糖,但这不会改变
返回的含义

截至2014年末,返回的
是正确的,终止发电机的
提升停止迭代
已列入折旧计划。有关详细信息,请参阅

摘要 此PEP建议对生成器进行更改:当在生成器中引发
StopIteration
时,它将替换为
RuntimeError
。(更准确地说,当异常即将从生成器的堆栈帧中冒泡出来时,就会发生这种情况。)因为更改是向后不兼容的,所以最初使用
\uuuuuuu future\uuu
语句引入该功能

接受 该政治公众人物于11月22日被BDFL接受

根本原因 生成器和StopIteration之间的交互目前有点令人惊讶,并且可以隐藏一些模糊的bug。意外异常不应导致行为的细微改变,但应引起嘈杂且易于调试的回溯。当前,在生成器函数中意外引发的StopIteration将被驱动生成器的循环构造解释为迭代的结束


在python3中,返回可以有一个表达式列表参数:注意:如果在生成器中显式引发StopIteration异常,可能会有一些方法(例如python3的多处理imap_unordered())继续出错,因为它们希望收到常规返回(或隐式返回)他们自己也要提高自己。有关基本原理,请参见@terry jan reedy在中的评论。显式或隐式('off the end')
return
是终止生成器的预期方式。如果PEP 479被接受,“raise StopIteration”版本最终将无法像现在这样工作。请注意,该版本于2014年11月被Python 3.5接受。