请稍等 ...
×

采纳答案成功!

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

middle函数中的while Ture 是如何退出的

如题 老师写的代码中并没有终止middle函数中的while Ture ,但是运行程序并没有被while Ture卡住,那么是如何做到让middle函数停止的呢?

我看到老师关于这个回答了
但是
是middle里的while true
不是sales_sum里的while true

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

2回答

bobby 2019-02-17 11:36:19

middle中调用了yield from这个就是说这里面在子协程中和调用方之间直接建立了通道 所以sales_sum
中return之后 middle也就return了 也就跳出了while循环

0 回复 有任何疑惑可以回复我~
  • 提问者 wireless_ZDJ #1
    还有一个问题:
    我把middle函数中的whlie ture给去掉了
    然后运行代码,抛出stopiteration
    不是说yield from可以捕获stopiteration吗???
    问题:
    为什么要在middle函数里写while true
    回复 有任何疑惑可以回复我~ 2019-02-17 11:52:31
  • bobby 回复 提问者 wireless_ZDJ #2
    yield from处理的是sales_num中的stopiteration 而不是处理父协程的stop这个我在yield from的原理中讲解过
    回复 有任何疑惑可以回复我~ 2019-02-19 16:03:39
bobby 2019-02-15 12:13:37

你能贴一下代码吗?

0 回复 有任何疑惑可以回复我~
  • 提问者 wireless_ZDJ #1
    final_result = {}
    
    def middle(key):
        while True:
            final_result[key] = yield from sales_sum(key)
            print(key+"销量统计完成!!.")
    
    def sales_sum(pro_name):
        total = 0
        nums = []
        while True:
            x = yield
            print(pro_name+"销量: ", x)
            if not x:
                break
            total += x
            nums.append(x)
        return total, nums
    
    def main():
        data_sets = {
            "bobby牌面膜": [1200, 1500, 3000],
            "bobby牌手机": [28,55,98,108 ],
            "bobby牌大衣": [280,560,778,70],
        }
        for key, data_set in data_sets.items():
            print("start key:", key)
            m = middle(key)
            m.send(None) # 预激middle协程
            for value in data_set:
                m.send(value)   # 给协程传递每一组的值
            m.send(None)
        print("final_result:", final_result)
    
    if __name__ == '__main__':
        main()
    ----------------------------------------------------------------
    代码是12-9yield from example的代码
    老师在视频里讲了子生成器函数sales_sum的退出
    不知道委托生成器函数的middle的while true什么时候退出???
    回复 有任何疑惑可以回复我~ 2019-02-15 20:33:54
  • 放牛班的春天0 回复 提问者 wireless_ZDJ #2
    m.send(None)使得sales_num生成器执行结束了, middle执行完print了, while True会让程序继续从yield from这一行开始执行,则此时又进入到yield from sales_num中, 到 x = yield这一步暂停,  因为m.send(None)是从上一个暂停的地方执行到下一个yield语句暂停,然后因为main中的for进入下一层循环了,m对象又被重新赋值了, 所以之前的状态都消失了, while True没有退出过,只是生成器重新初始化了而已
    回复 有任何疑惑可以回复我~ 2019-11-12 15:54:33
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信