首页  >  文章  >  后端开发  >  Return 如何影响 Python 3.3 中的生成器行为?

Return 如何影响 Python 3.3 中的生成器行为?

Barbara Streisand
Barbara Streisand原创
2024-10-24 17:16:02675浏览

How does Return Affect Generator Behavior in Python 3.3?

Return Inside Generator with Yield

在 Python 3.3 中,针对生成器函数中 return 和 Yield 的使用引入了重大更改。与 Python 2 不同,此类代码会触发错误,而 Python 3.3 允许这样做。但是,该行为与人们预期的不同。

考虑以下 Python 3.3 代码:

<code class="python">def f():
  return 3
  yield 2
  
x = f()
print(x.__next__())</code>

如果运行此代码,您会注意到抛出了一个异常:StopIteration: 3. 此异常有两个关键方面:

  • 引发 StopIteration: 生成器函数内的 return 语句现在相当于 raise StopIteration()。
  • 可通过异常访问的值:返回的值(在本例中为 3)可通过异常对象的 value 属性访问。

因此,当生成器函数同时包含 return 和yield,这就像引发具有指定返回值的 StopIteration 异常。这意味着生成器将终止,并且返回值将通过异常的 value 属性获得。

换句话说,虽然生成器函数中的 return 以前是一个错误,但现在它有一个特定的目的:终止生成器并通过异常处理机制返回一个值。

此行为对使用 Python 3.3 中新的 Yield from 语法的生成器委托有影响。例如:

<code class="python">def f():
    return 1
    yield 2

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

# Iterate over generator to run it
for _ in g():
    pass</code>

在此代码中,生成器 f 返回 1,然后委托给生成器 g,后者打印返回值。但是,您只会看到打印的 1,这表明在 f 中的yield 语句产生值 2 之前,yield 语句停止了委托。

以上是Return 如何影响 Python 3.3 中的生成器行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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