我在Python yield
学习,发现yield
不仅是生成器输出返回值的方式,而且是将值放入生成器的方法。例如以下代码
def f():
print (yield),
print 0,
print (yield),
print 1
g = f()
g.send(None)
g.send('x')
g.send('y')
在全球范围内,它send
的值'x'
,'y'
到生成器,因此在f
中它将输出x 0 y 1
。但我无法理解
yield
s但3 send
s。为什么要在第一时间发送None
?StopIteration
处抛出send
。有没有办法避免这种例外?有人可以解释一下吗?提前谢谢。
答案 0 :(得分:10)
当调用
send()
来启动生成器时,必须使用None
作为参数调用它,因为没有yield
表达式可以接收该值。
至于例外,你无法真正避免它。当迭代完成时,生成器抛出此异常,因此不要避免它,只需捕获它:
g = f()
try:
g.send(None)
g.send('x')
g.send('y')
except StopIteration:
print 'Done'