我正在乱搞并注意到以下代码产生一次值,而我期望它返回一个生成器对象。
def f():
yield (yield 1)
f().next() # returns 1
def g():
yield (yield (yield 1)
g().next() # returns 1
我的问题是value
表达式的yield
是什么,以及为什么如果屈服表达式崩溃,我们允许嵌套产量表达式?
恢复后
yield
expression的值取决于恢复执行的方法。如果使用__next__()
(通常通过for
或next()
内置),那么结果就是None
。否则,如果使用send()
,则结果将是传递给该方法的值。
所以这:
def f():
yield (yield 1)
相当于:
def f():
x = yield 1
yield x
在这种情况下(因为你没有使用generator.send()
)相当于:
def f():
yield 1
yield None
您的代码只查看生成器生成的第一个项目。如果你改为调用list()
来消耗整个序列,你会看到我描述的内容:
def f():
yield (yield 1)
def g():
yield (yield (yield 1))
print(list(f()))
print(list(g()))
输出:
$ python3 yield.py
[1, None]
[1, None, None]
如果我们手动迭代生成器(就像你有),但.send()
它的值,那么你可以看到yield
“返回”这个值:
gen = f()
print(next(gen))
print(gen.send(42))
输出:
$ python3 yield_manual.py
1
42