44 lines
888 B
Python
44 lines
888 B
Python
|
"""
|
||
|
A coroutine to compute a running average
|
||
|
|
||
|
# tag::CORO_AVERAGER_TEST[]
|
||
|
>>> coro_avg = averager() # <1>
|
||
|
>>> next(coro_avg) # <2>
|
||
|
0.0
|
||
|
>>> coro_avg.send(10) # <3>
|
||
|
10.0
|
||
|
>>> coro_avg.send(30)
|
||
|
20.0
|
||
|
>>> coro_avg.send(5)
|
||
|
15.0
|
||
|
|
||
|
# end::CORO_AVERAGER_TEST[]
|
||
|
# tag::CORO_AVERAGER_TEST_CONT[]
|
||
|
|
||
|
>>> coro_avg.send(20) # <1>
|
||
|
16.25
|
||
|
>>> coro_avg.close() # <2>
|
||
|
>>> coro_avg.close() # <3>
|
||
|
>>> coro_avg.send(5) # <4>
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
StopIteration
|
||
|
|
||
|
# end::CORO_AVERAGER_TEST_CONT[]
|
||
|
|
||
|
"""
|
||
|
|
||
|
# tag::CORO_AVERAGER[]
|
||
|
from collections.abc import Generator
|
||
|
|
||
|
def averager() -> Generator[float, float, None]: # <1>
|
||
|
total = 0.0
|
||
|
count = 0
|
||
|
average = 0.0
|
||
|
while True: # <2>
|
||
|
term = yield average # <3>
|
||
|
total += term
|
||
|
count += 1
|
||
|
average = total/count
|
||
|
# end::CORO_AVERAGER[]
|