I'm studying in Python yield
and find that yield
is not only the way in which generators output a return value but also a way to put values into a generator. For example the following code
def f():
print (yield),
print 0,
print (yield),
print 1
g = f()
g.send(None)
g.send('x')
g.send('y')
In the global scope it send
s value 'x'
, 'y'
to the generator and thus in f
it will output x 0 y 1
. But I cannot understand
yield
s but 3 send
s. Why should it send None
at the first time?StopIteration
at the last send
. Is there any way to avoid this exception?Could anyone please explain that? Thanks in advance.
From the documentation:
When
send()
is called to start the generator, it must be called withNone
as the argument, because there is noyield
expression that could receive the value.
As for the exception, you can't really avoid it. The generator throws this exception when it's done iterating, so instead of avoiding it, just catch it:
g = f()
try:
g.send(None)
g.send('x')
g.send('y')
except StopIteration:
print 'Done'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With