1

我在看http://www.dabeaz.com/coroutines/,我觉得这很有趣,但在一个例子中,有一种我不理解的行为。

bogus.py示例中,在此处报告

# bogus.py
#
# Bogus example of a generator that produces and receives values
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

# The holy grail countdown
c = countdown(5)
for x in c:
    print x
    if x == 5:
        c.send(3)

生成的数字序列是 5、2、1、0,我不明白数字 3 去了哪里:在 之后send(3),变量n设置正确,但在第二次执行时yield,看起来值 3 只是不屈服于 for 循环。

有人可以澄清我为什么会这样吗?

4

1 回答 1

3

3从 退回.send(),但被丢弃。生成器产生5, 3, 2, 1, 0; 但是因为3返回到.send()调用,你看不到打印的值。for循环永远不会看到它。

会发生什么:

  • for循环第一次调用next()生成器时,代码会前进,直到5产生。
  • x == 5True,所以c.send(3)被称为。代码通过生成器函数前进,并newvalue设置为3.
  • 生成器不会那里暂停,它现在拥有控制权。生成器运行while循环并返回(yield n)表达式。3产生。它成为 的返回值c.send(3)。返回值在这里被丢弃。
  • for循环继续,再次调用next()。生成器再次继续yield返回None,循环到n -= 1和 yielding 2
  • for循环继续调用生成器next()10产生,生成器结束。

generator.send()文档中引用:

恢复执行并将一个值“发送”到生成器函数中。value参数成为当前yield表达式的结果。send()方法返回生成器产生的下一个值,或者StopIteration如果生成器退出而不产生另一个值,则引发。

强调我的。

于 2013-08-01T09:59:04.593 回答