迭代器、生成器与 itertools
本章讲解 Python 迭代器与生成器的完整知识体系,包括迭代原理、自定义迭代器、生成器语法和 itertools 模块。
贯穿项目:日志分析系统
本章以日志分析系统贯穿各节,从简单迭代到复杂流处理:
┌─────────────────────────────────────────────────────────────┐
│ 日志分析系统贯穿演进 │
│ │
│ 第1节 迭代基础 │
│ ───────────────────────────────────────────── │
│ → 逐行读取10GB日志文件 │
│ → 理解 for 循环背后的 iter/next │
│ │
│ 第2节 自定义迭代器 │
│ ───────────────────────────────────────────── │
│ → LogIterator 类,按时间范围过滤 │
│ → 实现迭代器协议 │
│ │
│ 第3节 生成器基础 │
│ ───────────────────────────────────────────── │
│ → parse_logs() 解析复杂格式 │
│ → 用 yield 简化代码 │
│ │
│ 第4节 生成器高级特性 │
│ ───────────────────────────────────────────── │
│ → yield from 合并多个日志源 │
│ → 实现双向通信 │
│ │
│ 第5节 itertools │
│ ───────────────────────────────────────────── │
│ → 按小时分组统计错误数 │
│ → 高效批量处理 │
│ │
│ 第6节 异步生成器 │
│ ───────────────────────────────────────────── │
│ → 异步收集多服务器日志 │
│ → async yield 异步流处理 │
│ │
└─────────────────────────────────────────────────────────────┘章节导航
| 章节 | 文件 | 主题 | 贯穿实战 |
|---|---|---|---|
| 01 | 01-迭代基础.md | 可迭代对象、迭代器、for 循环原理 | filter_errors() 过滤日志错误 |
| 02 | 02-自定义迭代器.md | 迭代器协议、自定义迭代器类 | LogIterator 按时间范围过滤 |
| 03 | 03-生成器基础.md | yield 关键字、生成器表达式 | parse_logs() 解析日志格式 |
| 04 | 04-生成器高级特性.md | send()、throw()、close() | merge_logs() 合并多源日志 |
| 05 | 05-itertools模块.md | 无限迭代器、组合迭代器 | groupby_errors() 按小时分组 |
| 06 | 06-异步生成器.md | async yield、AsyncGenerator | async_fetch_logs() 异步收集 |
核心概念
┌─────────────────────────────────────────────────────────────┐
│ 迭代概念关系图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 可迭代对象 │
│ ─────────────────── │
│ • 实现了 __iter__() 方法 │
│ • 例如:list, tuple, str, dict, set, range │
│ │
│ ▼ iter() 获取 │
│ │
│ 迭代器 │
│ ─────────────── │
│ • 实现了 __iter__() 和 __next__() 方法 │
│ • 每次返回一个值,直到耗尽 │
│ │
│ ▼ yield 关键字 │
│ │
│ 生成器 │
│ ─────────────── │
│ • 使用 yield 的函数 │
│ • 惰性求值,内存友好 │
│ │
│ ▼ async def + yield │
│ │
│ 异步生成器 │
│ ───────────────────────── │
│ • async def 函数中使用 yield │
│ • 异步惰性求值,用 async for 遍历 │
│ │
└─────────────────────────────────────────────────────────────┘生活类比
| 概念 | 类比 | 说明 |
|---|---|---|
| 可迭代对象 | 播放列表 | 存了很多歌,可以多次播放 |
| 迭代器 | 播放指针 | 知道当前播放到哪一首,用完即弃 |
| for循环 | 自动播放 | 自动点击"下一首",播完停止 |
| yield | 暂停点打卡 | 做一步歇一步,下次从这里继续 |
核心语法
python
# 迭代器协议
class MyIterator:
def __iter__(self):
return self
def __next__(self):
raise StopIteration
# 生成器函数
def my_generator():
yield 1
yield 2
# 生成器表达式
gen = (x ** 2 for x in range(10))