averager() 코루틴을 변형해서 값을 반환하고, 활성화할 때마다 이동 평균을 생성하지 않는다.
의미 있는 값을 생성하지는 않지만 최후에 어떤 의미 있는 값을 반환하는 코루틴도 있음을 설명해야 한다.
#결과를 반환하는 averager() 코루틴 코드
from collections import namedtuple
Result = namedtuple('Result', 'count average')
def averager():
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)
#averager()의 동작을 보여주는 doctest
coro_avg = averager()
next(coro_avg)
coro_avg.send(10)
coro_avg.send(30)
coro_avg.send(6.5)
coro_avg.send(None)
return 문이 반환하는 값은 StopIteration 예외의 속성에 담겨 호출자에 밀반입됨에 주의하고, 실행이 완료되면 StopIteartion 예외를 발생시키는 기존 제너레이터 객체의 작동 방식을 유지한다.
coro_avg = averager()
next(coro_avg)
coro_avg.send(10)
coro_avg.send(30)
coro_avg.send(6.5)
try:
coro_avg.send(None)
except StopIteration as exc:
result = exc.value
result