Python Generators and Coroutines
Implementing Python generators — from generator expressions through yield from, send/throw/close, and bidirectional coroutines.
When to Use
- Processing data streams with generator pipelines
- Implementing coroutines for cooperative multitasking
- Lazy evaluation and infinite sequences
- Data pipeline composition
Generator Patterns
def pipeline(*steps):
"""Chain generator functions."""
def run(initial):
result = initial
for step in steps:
result = step(result)
return result
return run
def read_chunks(file, size=8192):
while True:
chunk = file.read(size)
if not chunk: break
yield chunk
def grep(pattern):
"""Bidirectional coroutine generator."""
while line := (yield):
if pattern in line:
yield line
Verification Checklist
- Generator expressions vs list comprehensions
- yield from for subgenerator delegation
- .send() for bidirectional communication
- Generator pipeline composition
- Memory-efficient large data processing