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. 此异常有两个关键方面:
因此,当生成器函数同时包含 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中文网其他相关文章!