生成和接收值的Python生成器

时间:2019-04-11 06:48:40

标签: python

有人可以在下面的代码中解释yield如何工作吗?

def countdown(n):
    print("Counting down from", n)
    while n >= 0:
        newvalue = (yield n)

        if newvalue is not None:
            n = newvalue
        else:
            n -= 1

c = countdown(5)
for n in c:
    print n
    if n == 4:
        c.send(2)

输出

('Counting down from', 5)
5
4
1
0

我希望是

('Counting down from', 5)
5
4
2
1
0

“ 2”在哪里迷路?

同时跟踪这两个事件(接收和产生)变得有些棘手。这不是python generator "send" function purpose?的重复,因为该问题主要集中在了解协程的必要性以及它们如何从生成器中推导。我的问题非常针对协同使用协程和生成器的问题。

1 个答案:

答案 0 :(得分:1)

The duplicate question具有相关文档:

  

send()方法返回生成器产生的下一个值 [。]

And this answer there在此处说明了如何使用send()来回移动控件。首先,添加其他print来说明正在发生的事情:

def countdown(n):
    print("Counting down from", n)
    while n >= 0:
        newvalue = (yield n)
        print (newvalue, n) # added output

        if newvalue is not None:
            n = newvalue
        else:
            n -= 1

c = countdown(5)
for n in c:
    print n
    if n == 4:
        print(c.send(2))   # added output.

您会看到:

('Counting down from', 5)
5
(None, 5)
4
(2, 4)
2
(None, 2)
1
(None, 1)
0
(None, 0)

通过send(2),将控制传递给函数newvalue = (yield n),该循环继续进行,直到下一个收益率循环,再次停止,但是这次产生的值由{{ 1}},不是。有您的send(2)