请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

委托生成器为什么要使用while True?

在yield_from_example.py文件里,仔细看了这个统计sum的例子:
def middle(key):
while True:
final_result[key] = yield from sales_sum(key)
print(key+“销量统计完成!!.”)
我对于这个委托生成器为什么要使用while True表示不理解:
1.单一商品,统计完成后,委托生成器也就close了,实际上也就while循环了一次,为什么还需要while True?
2.while True明明是无限循环,为什么可以循环一次后就可以close委托生成器了呢?

我尝试将while True去掉,代码写成如下这样,其他不变:
def middle(key):
#while True:
final_result[key] = yield from sales_sum(key)
print(key+“销量统计完成!!.”)
此时报StopIteration异常,应该是子生成器报的,如果这个结论成立,就有以下推论:主调用方发送到None时,因为子生成器调到return了,所以报这个异常,但是yield from存在呀!能处理这个异常。这么说while True是否存在是yield from能否正确处理子生成器异常的关键,可是为什么会这样?
不管while True是否存在,yield from和后面的print销量统计完成都会执行一遍,为什么有没有while True成为是否抛出StopIteration的影响因素?

按照上面的结果,当主调用方send数据到子生成器时,依赖委托生成器的while True。试验了下,在不用send、只需要委托和子生成器yield回来值的场景下,不使用while True也不会有异常,这又是为什么?

正在回答 回答被采纳积分+3

1回答

放牛班的春天0 2019-11-12 16:05:33

m.send(None)从上一个暂停的地方启动,到下一个yield语句继续暂停, 但是此时若没有while True, 两个生成器都执行完了, 那么会抛出StopIteration通知调用方生成器执行结束了(这个之前有讲的), 个人认为有两种方式解决的,1.middle最后一行加上yield,让m.send(None)在这一步暂停就可以了, 2.直接try...except m.send(None)抛出的StopIteration. 

至于while True无限循环为什么只循环一次,是因为m.send(None)寻找下一个yield语句, 此时while True执行第二次时又进入到了sales_num中,然后执行到x = yield暂停了, main中的for开始执行第二个key了, m又被重新初始化了,那么之前的状态就不存在了, 所以严格来说循环了一次后暂停了不是close,所以这里的while True不是很理解用意,感觉用上述的两种方法结束会更加好理解一点 

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信