首页  >  文章  >  后端开发  >  Python 3.3 生成器中 Return 和 Yield 如何协同工作?

Python 3.3 生成器中 Return 和 Yield 如何协同工作?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 04:39:02244浏览

How Do Return and Yield Work Together in Python 3.3 Generators?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn