在 Python 生成器中一起使用 Return 和 Yield
在 Python 2 中,也使用了 Yield 的生成器函数内的 return 语句将导致一个错误。然而,在Python 3.3中,发生了微妙的变化。
代码演示
考虑以下Python 3.3代码:
def f():
return 3
yield 2
x = f()
print(x.__next__())
解释
在此代码中,函数 f 包括 return 语句和yield 语句。调用该函数时,先执行return语句,返回值3。因此,yield 语句不会被执行。
当通过调用 next 方法迭代生成器 x 时,会引发 StopIteration 异常,其值为 3。这意味着生成器的迭代器耗尽,return 语句返回的值可作为异常的 value 属性。
Python 3.3 中的新机制
根据 PEP 380 ,此行为是 Python 3.3 中引入的新功能。相当于写:
def f():
yield 3
raise StopIteration
Yield from
的示例以下示例演示了此行为如何影响使用 Yield from 语法委托的生成器:
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
在这种情况下,yield from语句委托给生成器f。由于 f 返回一个值,但不再有yield 语句,因此打印值 1。但是f中的yield 2语句并没有被执行。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3