在Python 2中,当函数定义中的return和yield一起使用时,出现错误。但是对于Python3.3中的这段代码
def f():
return 3
yield 2
x = f()
print(x.__next__())
在函数中使用return和yield是没有错误的。但是,当调用函数__next__
时,会抛出异常StopIteration。为什么没有直接返回值3
?这个返回值被忽略了吗?
发布于 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。
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
。
发布于 2013-05-28 04:18:11
返回值不会被忽略,但生成器只产生值,return
只是结束生成器,在本例中是提早结束。在这种情况下,推进生成器永远不会到达yield
语句。
每当迭代器到达要产生的值的“end”时,就必须引发StopIteration
。生成器也不例外。然而,从Python3.3开始,任何return
表达式都会成为异常的值:
>>> def gen():
... return 3
... yield 2
...
>>> try:
... next(gen())
... except StopIteration as ex:
... e = ex
...
>>> e
StopIteration(3,)
>>> e.value
3
使用next()
函数来推进迭代器,而不是直接调用.__next__()
:
print(next(x))
https://stackoverflow.com/questions/16780002
复制相似问题