下面我们用协程来实现平均值的计算,区别之前的闭包。
这个无限循环表明,只要调用方不断把值发给这个协程,它就会一直接收值,然后生成 结果。仅当调用方在协程上调用 .close()
方法,或者没有对协程的引用而被垃圾回收 程序回收时,这个协程才会终止。
这里的 yield
表达式用于暂停执行协程,把结果发给调用方;还用于接收调用方后面发 给协程的值,恢复无限循环。
使用协程的好处是,total
和 count
声明为局部变量即可,无需使用实例属性或闭包在多 次调用之间保持上下文。
1、创建协程对象。
2、 调用 next 函数,预激协程。
3、计算移动平均值:多次调用 .send(...)
方法,产出当前的平均值。
调用 next(coro_avg)
函数后,协程会向前执行到 yield
表 达式,产出 average
变量的初始值——None
,因此不会出现在控制台中。此时,协程在 yield
表达式处暂停,等到调用方发送值。coro_avg.send(10)
那一行发送一个值,激活 协程,把发送的值赋给 term
,并更新 total、count
和 average
三个变量的值,然后开始 while 循环的下一次迭代,产出 average
变量的值,等待下一次为 term
变量赋值。