为什么收益率表达式崩溃?

问题描述 投票:5回答:1

我正在乱搞并注意到以下代码产生一次值,而我期望它返回一个生成器对象。

def f():
    yield (yield 1) 
f().next() # returns 1

def g():
    yield (yield (yield 1) 
g().next() # returns 1

我的问题是value表达式的yield是什么,以及为什么如果屈服表达式崩溃,我们允许嵌套产量表达式?

python yield
1个回答
7
投票

恢复后yield expression的值取决于恢复执行的方法。如果使用__next__()(通常通过fornext()内置),那么结果就是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
© www.soinside.com 2019 - 2024. All rights reserved.