yield from是python3新增的语法
yield from gen_fun(), gen_fun是一个迭代器(列表, 字符串), yield from把函数分成了3个角色
1.委托生成器函数(可以理解为一个管道或者队列), 包含有yield from gen_fun()语法, 获取gen_fun()函数(子生成器)的返回值(return回来的值, 不是yield生成值).
2.子生成器函数gen_fun(), 包含有term = yield语法的函数, term是获取调用方send过来的参数
- 调用方, 前面一章介绍过, 主要是send发送数据
下面使用流畅的python书中的代码(简化一下, 去除一下影响阅读的代码)
(https://github.com/fluentpython/example-code/blob/master/16-coroutine/coroaverager3.py)
代码说明
- 创建一个Result的自定义数据结构, 包含count和average变量, 作为返回值
- 定义委托生成器grouper, yield from avgerager()启动之后在此处暂停, results[key]的结果from于avgerager()子生成器的返回结果
- 定义子生成器avgerager(), 执行方式和第一章的一样, 当循环结束的时候, 返回结果给委托生成器, 赋值给results[key]
- 创建调用方main函数
- group = grouper(results, key) 创建grouper委托生成器对象.
- next(group) 激活委托生成器
- 循环data数据中的列表, send(value)把数据发送给子生成器的term
- 当列表中的数据发送完成之后, send(None), 终止子生成器, 子生成器终止之后, return计算出来的数据返回给委托生成器, 委托生成器中继续循环重复上述4步,
- 完成列表中的数据之后print(results)
最后yield from替代嵌套for循环产出值
def chain(*args):
for i in args:
yield from i #委托生成器yield的值来自i迭代器的每一个值
if __name__ == '__main__':
print(list(chain(['A', 'B', 'C'], [1, 2, 3])))
下面是书中的一个列子, 可以看看
https://github.com/dabeaz/python-cookbook/blob/master/src/4/how_to_flatten_a_nested_sequence/example.py
拆分包含列表的列表
下一章介绍多线程与协程asyncio