1.生成器, python函数中包含有yield关键字的函数可以理解为生成器, 可以用于惰性加载
2.协程, 调用方可以与生成器函数交互的函数, 调用方可以向生成器发送数据, 生成器可以产生数据返回给调用方。
上面是开始yield的2个重要概念, 由后面要写yield from该语法python2没有, 我们直接使用python3
- 调用方与协程是如何通过yield实现交互
代码说明: 以上代码来源于流畅的python
- 计算历史数据的平均值<一>
# 创建协程对象
avg_arg_obj = avg_arg()# 启动协程, avg_arg函数开始运行, 进入while循环, 在yield出暂停
next(avg_arg_obj)# 向协程发送数据, 直接到term = yield代码的暂停出, yield左边的变量用于接收调用方send过来的数据,
yield右边暂时没有变量, 表示协程不生成数据给调用方。
avg_arg_obj.send(10) # term = 10 print(avg_num) is 10.0
avg_arg_obj.send(30) # 同上
20.0
- 计算历史数据的平均值<二>
这个代码比第一版复杂一点
- 首先实现一个类包装器(//www.greatytc.com/p/30dae1d3e72c), 来包装协程, 该装饰器主要用来启动协程, 不用每次手动next启动协程
- yield出多了一个avg_num变量, 这个就是用来生成数据返回给调用者, 所以每次调用者send变量之后, term计算完之后, 协程yield出avg_num给调用方, 然后在yield出继续暂停等待send数据处理
3.计算历史数据的平均值<三>
终止协程和异常处理, 这个知识点可以去看流畅的python中查看这一章。 主要记住协程中未处理的异常会向上抛出。 如果发送send(None), break协程会向上抛出StopIteration, 协程此刻处于GEN_CLOSED状态不能再接受数据, 可以直接使用close()函数终止协程。
下面一章将继续介绍yield from
python从yield到asyncio<第一章>
python从yield到asyncio<第二章>
python从yield到asyncio<第二章>