I'm familiar with yield to return a value thanks mostly to this question
but what does yield do when it is on the right side of an assignment?
@coroutine
def protocol(target=None):
while True:
c = (yield)
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
I came across this, on the code samples of this blog, while researching state machines and coroutines.
The
yield
statement used in a function turns that function into a "generator" (a function that creates an iterator). The resulting iterator is normally resumed by callingnext()
. However it is possible to send values to the function by calling the methodsend()
instead ofnext()
to resume it:In your example this would assign the value
1
toc
each time.cr.next()
is effectively equivalent tocr.send(None)
You can send values to the generator using the
send
function.If you execute:
then
yield
will return 5, so inside the generatorc
will be 5.Also, if you call
p.next()
,yield
will returnNone
.You can find more information here.