Search code examples
pythongeneratoryield

Python generator yield behaviour


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?


Solution

  • 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.