yield 的 StopIteration 请帮我解释一下
def tt():
x = yield
print('x=', x)
pass
gen = tt()
gen.send(None)
gen.send(11)
print('--------')
gen.close()
我的理解是,send给生成器发送数据11--->函数tt()里面执行完毕--->又回到send那里,这时候不是应该继续正常执行send后面的代码吗,send后面又没有再次调用生成器,为什么这个时候会抛出StopIteration这个异常呢? 难道send方法调用两次??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
过程少了一步:send给生成器发送数据11--->函数tt()里面执行完毕--->找下一个yield语句--->又回到send那里,因为这里它找下一个yield语句找不到,所以就会报StopIteration异常。
第一个send(None)走到第一个yield这里,因为生成器刚启动的第一次是不执行的,而只是悬空等待。第二次send(11),才开始执行赋值语句x = yield,但执行完之后,它又会寻觅下一个yield进行等待,因为找不到,所以就报错。
只需要把pass改成yield就可以了:
实际上yield这个词有阻止和等待的意思,你看一看美国的路牌就知道了:
在几乎所有小路上大路的地方,都立有这样的标志,类似于中国的缓行避让的意思。所以在这里,一看见yield,马上就停止,大概就是这个意思。
很简单,函数执行完 当然抛出 异常