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

时间:2015-06-19 09:49:06

标签: python yield coroutine

我们在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 =>产量i => a1 = 21 => send(66)=> x = 66

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

打印7766

打印21

打印5

即。在yield i之后,a1获得j的值;在yield j之后,a2获得i的值。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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