python3 协程
协程
协程与生成器类似,都是定义体中包含yield关键字的函数,区别于:
- 协程中,yield通常出现在表达式的右边,可以产出值,如果yield后面没有表达式,那么生成器产出None。
- 协程可以从调用方接受数据,使用.send(data),而不是next()函数.
1. 实例,使用协程极速按移动平均值
def average1():
total = 0.0
count = 0
average = None
while True:
print('start')
term = yield average
total += term
count += 1
average = total/count
print('end')
>>>c = average1()
>>>next(c) #预激协程,or c.send(None), 必须!
start
>>>c.send(12)
end
start
Out[54]: 12.0
>>>c.send(122)
end
start
Out[55]: 67.0
2. 使用装饰器自动预激协程
#使用装饰器自动预激协程
from functools import wraps
def coroutine(func):
@wraps(func)
def primer(*args, **kargs):
gen = func(*args, **kargs)
next(gen)
return gen
return primer
@coroutine
def average():
total = 0.0
count = 0
average = None
while True:
print('start')
term = yield average
total += term
count += 1
average = total/count
print('end')
让协程返回值
#让协程返回值
from collections import namedtuple
Result = namedtuple('Result','count average')
def average3():
count, average,total = 0, 0.0,0.0
while True:
term = yield
if term is None:
break
total += term
count += 1
average = total / count
return Result(count, average)