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

Mary-Kate Olsen
发布: 2024-10-25 04:39:02
原创
324 人浏览过

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板