首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成器中的raise StopIteration和return语句有什么区别?

生成器中的raise StopIteration和return语句有什么区别?
EN

Stack Overflow用户
提问于 2013-01-06 23:52:11
回答 3查看 33.7K关注 0票数 44

我很好奇在生成器中使用raise StopIterationreturn语句有什么不同。

例如,这两个函数之间有什么区别吗?

代码语言:javascript
运行
复制
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异常。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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属性。

票数 52
EN

Stack Overflow用户

发布于 2015-05-13 22:23:41

截至2014年底,return是正确的,用于结束发电机的raise StopIteration正在折旧计划中。有关详细信息,请参阅PEP 479

摘要

这个PEP提出了对生成器的更改:当在生成器中引发StopIteration时,它将被替换为RuntimeError。(更准确地说,当异常即将从生成器的堆栈框架中冒出来时,就会发生这种情况。)因为更改是向后不兼容的,所以最初使用__future__语句引入该特性。

验收

此PEP已于…年11月22日被BDFL接受

基本原理

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

票数 24
EN

Stack Overflow用户

发布于 2013-01-07 00:00:17

这是真的,它们是等价的,除了一个是可读的,而另一个是晦涩的。这可以追溯到生成器的第一个版本(PEP255,在"Specification: Return“下),随后的增强(例如协程)不会改变这一点。3.3的yield from (PEP380)将其扩展到return <expr>,作为raise StopIteration(<expr>)的语法糖,但这并没有改变return;的含义。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14183803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档