以下是代码(由David Beazley提供,幻灯片#32 http://dabeaz.com/coroutines/Coroutines.pdf):
def countdown(n):
print "Counting down from", n
while n >= 0:
newvalue = (yield n)
# If a new value got sent in, reset n with it
if newvalue is not None:
n = newvalue
else:
n -= 1
c = countdown(5)
for n in c:
print n
if n == 5:
c.send(3)
这是输出:http://codepad.org/8eY3HLsK
据我所知,它不打印4,但为什么不打印3?一旦n设置为3,下一次迭代应该产生3而不是2?我错过了什么?
答案 0 :(得分:4)
作为documented,向生成器发送值也会使生成器再前进一步并生成其下一个值。值3在行c.send(3)
处产生,但您不对其执行任何操作,因此您看不到它。然后在下一次通过while循环的行程中,它从那里开始倒计时。如果您将最后一行更改为print c.send(3)
,则会看到3。