Python:一个函数中有两个 "yield"

Python: two "yield"s in one function

我们在 Python 的 yield 上发现了一个有趣的问题。我们写了一个简单的程序:

def F():
    for i in range(5, 9):
        for j in range(21, 29):
            x = yield i
            y = (yield j) * 100
            x += y
            print '>>>', x

gen = F()
next(gen)
a1 = gen.send(66)
a2 = gen.send(77)
print a1
print a2

结果很惊人:

>>> 7766
21
5

i=5, j=21 => yield i => a1=21 => send(66) => x = 66

i=5, j=21 => yield j => a2=5 => send(77) => y = 7700

打印 7766

打印 21

打印 5

yield i后,a1得到j的值; yield j后,a2得到i.

的值

有谁知道为什么 yield 这样做?为什么不是 a1=5,a2=21?

next(gen) 从第一个 yield i 调用方法 returns。您的 a1 = gen.send(66) 然后在 y = (yield j) * 100 恢复方法并从那里产生 ja2 = gen.send(77) 行之后直接恢复该方法,returns 从 x = yield i.

next(gen) 从生成器中取出第一个元素 (i):

next(gen) # 5

gen.send(66)等于j(即21)。由于您的第二个循环仍在工作,因此后续 gen.send(77) 等于 i (仍然是 5)。

本质上,问题是您消耗了 3 个值,而不是 2.

使用gen.send(None)next(gen)启动生成器:

a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21