为什么收益表达方式会崩溃?

时间:2018-09-09 18:37:57

标签: python yield

我在四处乱逛,发现以下代码只产生一次该值,而我希望它返回一个生成器对象。

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

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

我的问题是value表达式中的yield是什么?如果yield表达式崩溃,为什么我们允许嵌套yield表达式?

1 个答案:

答案 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))