Generator Mastery
Generator pipelines, coroutines, and advanced patterns.
Overview
Master generator patterns.
Generator Pipelines
def read_data(source):
for item in source:
yield item
def filter_data(data, predicate):
for item in data:
if predicate(item):
yield item
def transform_data(data, func):
for item in data:
yield func(item)
# Pipeline
source = range(100)
pipeline = transform_data(
filter_data(read_data(source), lambda x: x % 2 == 0),
lambda x: x ** 2
)
for item in pipeline:
print(item)
Coroutine Pipelines
def coroutine(func):
def wrapper(*args, **kwargs):
gen = func(*args, **kwargs)
next(gen)
return gen
return wrapper
@coroutine
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 (count, average)
avg = averager()
avg.send(10)
avg.send(20)
avg.send(30)
try:
avg.send(None)
except StopIteration as e:
print(e.value) # (3, 20.0)
Practice
Build a data processing pipeline using generators.