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