请稍等 ...
×

采纳答案成功!

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

yield from 问题

sale_data = {
    "95#": [150, 66, 523, 452],
    "92#": [200, 452, 125, 689, 54],
    "0#": [212, 548, 345]
}
final_res = {}


def sales_num(product_name):
    total = 0
    numbers = []

    while True:
        x = yield
        if not x:
            break
        print(product_name + "的销量为:{}".format(x))
        total += x
        numbers.append(x)

    return total, numbers


def middleware(product_name):
    final_res[product_name] = yield from sales_num(product_name)
    print(product_name + "统计完成!!!!")


def main():
    global final_res, sale_data
    for k, v in sale_data.items():
        print(k, "开始统计")
        m = middleware(k)
        m.send(None)  # 预激middleware委托生成器质性到yield from 处
        for value in v:
            m.send(value)

        m.send(None)
    print("统计结果为:", final_res)


if __name__ == '__main__':
    main()

运行结果:

95# 开始统计
95#的销量为:150
95#的销量为:66
95#的销量为:523
95#的销量为:452
95#统计完成!!!!
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/python-test/code_97/chapter12/my_yield_from_test.py", line 66, in <module>
    main()
  File "C:/Users/Administrator/Desktop/python-test/code_97/chapter12/my_yield_from_test.py", line 61, in main
    m.send(None)
StopIteration

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

2回答

bobby 2020-09-06 11:02:54

如果把while True去掉的话 在调用方send(None)之后 子生成器结束后会return结果到委托生成器的final_res[product_name]这个变量上,但是在调用方send(None)后并没有接收到yield返回的值,它会触发StopIteration 。
while True 使得委托生成器再进入到新的子生成器中,并在yield from sales_num(product_name)处暂停返回给调用方。这样就不会引发异常,其实不用while True 在委托生成器的最后添加一个yield也是可以的

0 回复 有任何疑惑可以回复我~
提问者 慕妹7002893 2020-09-04 17:57:05

已经解决  middle 没有写while Ture  , 但是没有弄懂为什么要写while Ture循环? 老师 可以解下惑吗?

0 回复 有任何疑惑可以回复我~

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信