Reputation: 3178
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)
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
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
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