Why does this Python generator/coroutine lose a value?

Viewed 327

Reading about Python coroutines, I came across this code:

def countdown(n):
    print("Start from {}".format(n))
    while n >= 0:
        print("Yielding {}".format(n))
        newv = yield n
        if newv is not None:
            n = newv
        else:
            n -= 1

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

which curiously outputs:

Start from 5
Yielding 5
5
Yielding 3
Yielding 2
2
Yielding 1
1
Yielding 0
0

In particular, it misses printing the 3. Why?


The referenced question does not answer this question because I am not asking what send does. It sends values back into the function. What I am asking is why, after I issue send(3), does the next yield, which should yield 3, not cause the for loop to print 3.

2 Answers
Related