Python generator yield behaviour

Question:

So I have the following generator function:

def gen(n=5):
    for i in range(n):
        n = yield n

for i in gen(3):
    print(i)

The result:

3
None
None

I understand the first result of yield is 3. Because I assigned 3 to function argument n. But where are the None in the second and third yield coming from? Is it because in the for-loop, yield n returns None and this None is assigned to n in this line: n = yield n?

Asked By: CyberPlayerOne

||

Answers:

It seems to me that you answered your own question:

because in the for-loop, yield n returns None and None is assigned to n in this line: n = yield n

You can read more at this answer.

Answered By: msailor

This is explained in the documentation of yield expressions, especially this part:

The value of the yield expression after resuming depends on the method
which resumed the execution. If next() is used (typically via
either a for or the next() builtin) then the result is None.
Otherwise, if send() is used, then the result will be the value passed
in to that method.

As you use a for loop, n just gets None as a value when resuming after the first yield. So, from now on, n is None, and this is what will be yielded the last two times.

Answered By: Thierry Lathuille
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.