I have the following code.
def gen():
while True: # line 2
d = yield # line 3
yield d # line 4
x = gen()
next(x)
for i in (3, 4, 5):
print(x.send(i)) # line 10
When I run this, I get:
3
None
5
rather than:
3
4
5
which is what I would expect. I've already gone through several similar questions (including this one) but I still don't understand what is happening here.
My understanding is as follows:
We prime the generator by calling next(x)
, it starts execution and enters the while
loop on line 2. On line 3, we have a yield
statement and execution pauses. On line 10, we send the value 3
. Execution resumes on line 3, d
is set to 3
, and we yield back d
. On line 10, send
returns the yielded value (3
). The generator continues execution until we are back to the yield
statement on line 3, etc.
Is this incorrect? What am I doing wrong here?
CodePudding user response:
x = yield y
does two things:
- Return
y
. - Assign the next sent value to
x
.
Without y
, None
gets returned. Without x =
, the sent value just gets thrown away.
So what happens here is:
code effects comments
---------------------------------------------
d = yield return None ok, you ignore it
d = 3
yield d return 3 gets printed
Throw away 4
d = yield return None gets printed
d = 5
yield d return 5 gets printed
You can fix it like this, always storing and returning every sent value:
def gen():
d = None # or `d = yield`, either works, just differently
while True:
d = yield d