为什么这段代码不打印3

时间:2013-09-25 04:49:05

标签: python generator coroutine

以下是代码(由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?我错过了什么?

1 个答案:

答案 0 :(得分:4)

作为documented,向生成器发送值也会使生成器再前进一步并生成其下一个值。值3在行c.send(3)处产生,但您不对其执行任何操作,因此您看不到它。然后在下一次通过while循环的行程中,它从那里开始倒计时。如果您将最后一行更改为print c.send(3),则会看到3。