Python advanced-example teaching thoroughly understand the meaning of yield from

In [56]: from collections import namedtuple

In [57]: def average():
    ...:     # 子生成器,直接接受客户端yield数据
    ...:     total =0.0
    ...:     count =0
    ...:     average = None
    ...:     while True:
    ...:         term = yield
    ...:         if term is None: # 收到None后,传值进入委派生成器
    ...:             break
    ...:         total += term
    ...:         count += 1
    ...:         average = total/count
    ...:     return Result(count,average)
    ...:
    ...:

In [58]: def grouper(results,key):
    ...:     # 委派生成器,在客户端发送数据时,不读取对应数据,在iyield from 后挂起进程,直至average结束
    ...:     while True:
    ...:         results[key]= yield from average()
    ...:
    ...:

In [59]: def main(data):
    ...:     # 客户端
    ...:     results = {}
    ...:     for key,values in data.items():
    ...:         group = grouper(results,key) # 每次创建一个新的group实例
    ...:         next(group) # 激活
    ...:         for value in values:
    ...:             group.send(value)
    ...:         group.send(None) # average结束,委派生成器进行赋值操作
    ...:     print(results)
    ...:     report(results) # 格式化打印
    ...:
    ...:
    ...:
    ...:
    ...:

In [60]: def report(results):
    ...:     for key,result in sorted(results.items()):
    ...:         print(key)
    ...:         group,unit = key.split(';')
    ...:         print('{:2} {:5} averageing {:.2f}'.format(result.count,group,result.average,unit))
    ...:
    ...:

In [61]: data = {'girls;kg':[10,9,8,7,6,5],'boys;kg':[1,2,3,4,5]}

In [62]: main(data)
{'girls;kg': Result(count=6, average=7.5), 'boys;kg': Result(count=5, average=3.0)}
boys;kg
 5 boys  averageing 3.00
girls;kg
 6 girls averageing 7.50

 

Guess you like

Origin blog.csdn.net/weixin_40539952/article/details/107484846