我在四处乱逛,发现以下代码只产生一次该值,而我希望它返回一个生成器对象。
def f():
yield (yield 1)
f().next() # returns 1
def g():
yield (yield (yield 1)
g().next() # returns 1
我的问题是value
表达式中的yield
是什么?如果yield表达式崩溃,为什么我们允许嵌套yield表达式?
答案 0 :(得分:7)
恢复后的
yield
expression的值取决于恢复执行的方法。如果使用x
(通常通过内置__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))