我们在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?
答案 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
恢复该方法,并从那里获得j
。 a2 = gen.send(77)
行会在之后直接恢复该方法并从x = yield i
返回。