python - 为什么这段代码不打印 3

标签 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?我错过了什么?

最佳答案

作为documented ,向生成器发送一个值也会使生成器前进一步并产生下一个值。值 3 在 c.send(3) 行产生,但您没有对它做任何事情,所以您看不到它。然后在 while 循环的下一次旅行中,它会从那里开始倒计时。如果将最后一行更改为 print c.send(3),那么您将看到 3。

关于python - 为什么这段代码不打印 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996444/

相关文章:

python - * 在 python 的打印函数中

python - 使用生成的文件名进行子进程调用

python - Python 3 中如何区分实例方法、类方法、静态方法或函数?

php - 如果函数同时包含 return 和 yield,为什么 php 会返回一个空的生成器?

使用workmanager的Android定期位置更新

python - 查找单词共现

php - 在回调中使用 yield?

python - 递归的中间结果

python - 从 Python 中的非协程函数运行协程函数?

android - 限制可以在范围内运行的最大协程数