一. 让协程返回值
下面的例子,我们再次改版之前计算平均值的协程函数,这一版本的协程函数每次被激活时,不会自动产出平均值,而是在最后返回一个值。(averager协程返回的结果是一个namedtuple,2个字段分别是count和average):
from collections import namedtuple
Result = namedtuple('Result', 'count average')
def average():
total = 0.0
count = 0
average = None
while True:
term = yield
if term is None:
break
total += term
count += 1
average = total / count
return Result(count, average)
为了返回值,协程必须正常终止,因此average中有个判断条件,以便退出累计循环;返回值为namedtuple,包含count和average两个字段。(注:python3.3之前如果生成器返回值,解释器会报句法错误)。
演示1 发送None会终止循环,导致协程结束
注意:一如既往,协程结束,协程对象会抛出StopIteration异常。return表达式的值通过异常对象StopIteration传递给调用方。这样做有点不合常理,但是能保留生成器对象的常规行为——在耗尽时抛出StopIteration异常。
演示2 获取协程return的值
捕获