python从yield到asyncio<第二章>

yield from是python3新增的语法
yield from gen_fun(), gen_fun是一个迭代器(列表, 字符串), yield from把函数分成了3个角色

python从yield到asyncio<第二章>_第1张图片
5.png

1.委托生成器函数(可以理解为一个管道或者队列), 包含有yield from gen_fun()语法, 获取gen_fun()函数(子生成器)的返回值(return回来的值, 不是yield生成值).

2.子生成器函数gen_fun(), 包含有term = yield语法的函数, term是获取调用方send过来的参数

  1. 调用方, 前面一章介绍过, 主要是send发送数据

下面使用流畅的python书中的代码(简化一下, 去除一下影响阅读的代码)
(https://github.com/fluentpython/example-code/blob/master/16-coroutine/coroaverager3.py)

python从yield到asyncio<第二章>_第2张图片
6.png

代码说明

  1. 创建一个Result的自定义数据结构, 包含count和average变量, 作为返回值
  2. 定义委托生成器grouper, yield from avgerager()启动之后在此处暂停, results[key]的结果from于avgerager()子生成器的返回结果
  3. 定义子生成器avgerager(), 执行方式和第一章的一样, 当循环结束的时候, 返回结果给委托生成器, 赋值给results[key]
  4. 创建调用方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

python从yield到asyncio<第一章>

你可能感兴趣的:(python从yield到asyncio<第二章>)