在 Python 生成器中同时使用 Return 和 Yield
在 Python 2 中,生成器函数内也使用了 Yield 的 return 语句将导致一个错误。然而,在 Python 3.3 中,发生了微妙的变化。
代码演示
考虑以下 Python 3.3 代码:
<code class="python">def f(): return 3 yield 2 x = f() print(x.__next__())</code>
说明
在这段代码中,函数f同时包含了return语句和yield语句。调用该函数时,先执行return语句,返回值3。因此,yield 语句不会被执行。
当通过调用其 next 方法迭代生成器 x 时,会引发 StopIteration 异常,其值为 3。这意味着生成器的迭代器耗尽,return 语句返回的值可作为异常的 value 属性。
Python 3.3 中的新机制
根据 PEP 380 ,此行为是 Python 3.3 中引入的新功能。它相当于编写:
<code class="python">def f(): yield 3 raise StopIteration</code>
Yield from
示例以下示例演示了此行为如何影响使用yield from语法委托的生成器:
<code class="python">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</code>
在这种情况下,yield from 语句委托给生成器 f。由于 f 返回一个值,但不再有yield 语句,因此打印值 1。然而,f中的yield 2语句并没有被执行。
以上是Python 3.3 生成器中 Return 和 Yield 如何协同工作?的详细内容。更多信息请关注PHP中文网其他相关文章!