首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python 3.3中,生成器中的返回和收益

在Python 3.3中,生成器中的返回和收益
EN

Stack Overflow用户
提问于 2013-05-28 04:16:38
回答 2查看 39.2K关注 0票数 67

在Python 2中,当函数定义中的return和yield一起使用时,出现错误。但是对于Python3.3中的这段代码

代码语言:javascript
运行
复制
def f():
  return 3
  yield 2

x = f()
print(x.__next__())

在函数中使用return和yield是没有错误的。但是,当调用函数__next__时,会抛出异常StopIteration。为什么没有直接返回值3?这个返回值被忽略了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-28 04:25:26

这是Python3.3中的一个新特性(作为注释,它甚至在3.2中都不起作用)。就像生成器中的return长期以来一直等同于raise StopIteration()一样,生成器中的return <something>现在也等同于raise StopIteration(<something>)。因此,您看到的异常应该打印为StopIteration: 3,并且可以通过exception对象上的属性value访问该值。如果生成器被委托使用(也是新的) yield from语法,那么它就是结果。详情请参见PEP 380

代码语言:javascript
运行
复制
def f():
    return 1
    yield 2

def g():
    x = yield from f()
    print(x)

# g is still a generator so we need to iterate to run it:
for _ in g():
    pass

这将打印1,但不打印2

票数 79
EN

Stack Overflow用户

发布于 2013-05-28 04:18:11

返回值不会被忽略,但生成器只产生值,return只是结束生成器,在本例中是提早结束。在这种情况下,推进生成器永远不会到达yield语句。

每当迭代器到达要产生的值的“end”时,就必须引发StopIteration。生成器也不例外。然而,从Python3.3开始,任何return表达式都会成为异常的值:

代码语言:javascript
运行
复制
>>> def gen():
...     return 3
...     yield 2
... 
>>> try:
...     next(gen())
... except StopIteration as ex:
...     e = ex
... 
>>> e
StopIteration(3,)
>>> e.value
3

使用next()函数来推进迭代器,而不是直接调用.__next__()

代码语言:javascript
运行
复制
print(next(x))
票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16780002

复制
相关文章

相似问题

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