我正在学习 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
。但我无法理解
- 有 2
yield
秒,但 3send
秒。为什么要在第一时间发送None
? - 它在最后一
send
抛出了一个StopIteration
.有什么方法可以避免这种异常吗?
谁能解释一下?提前谢谢。
从文档中:
当调用
send()
来启动生成器时,必须使用None
作为参数调用它,因为没有可以接收该值的yield
表达式。
至于例外,你真的无法避免它。生成器在完成迭代时会抛出此异常,因此与其避免它,不如捕获它:
g = f()
try:
g.send(None)
g.send('x')
g.send('y')
except StopIteration:
print 'Done'