我在看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循环。
有人可以澄清为什么会这样吗?
答案 0 :(得分:3)
3
已从.send()
返回,但已被丢弃。生成器生成5
,3
,2
,1
,0
;但由于3
已返回.send()
来电,因此您看不到该值已打印。 for
循环永远不会看到它。
这是怎么回事:
for
循环调用生成器上的next()
时,代码会前进,直到5
生成。x == 5
为True
,因此调用了c.send(3)
。代码通过生成器函数前进,newvalue
设置为3
。while
循环并返回(yield n)
表达式。 3
屈服了。它成为c.send(3)
的返回值。返回值在这里被丢弃。for
循环继续,再次调用next()
。再次继续生成器,yield
返回None
,循环到n -= 1
并产生2
。for
循环继续在生成器上调用next()
,1
并生成0
,生成器结束。来自generator.send()
documentation:
恢复执行并将值“发送”到生成器函数中。
value
参数成为当前yield
表达式的结果。send()
方法返回生成器产生的下一个值,如果生成器退出而没有产生其他值,则引发StopIteration
。
强调我的。