CyberPlayerOne
CyberPlayerOne

Reputation: 3178

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?

Upvotes: 1

Views: 114

Answers (2)

Thierry Lathuille
Thierry Lathuille

Reputation: 24288

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.

Upvotes: 4

msailor
msailor

Reputation: 340

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.

Upvotes: 2

Related Questions