Skip to content

迭代器、生成器与 itertools

本章讲解 Python 迭代器与生成器的完整知识体系,包括迭代原理、自定义迭代器、生成器语法和 itertools 模块。


贯穿项目:日志分析系统

本章以日志分析系统贯穿各节,从简单迭代到复杂流处理:

┌─────────────────────────────────────────────────────────────┐
│  日志分析系统贯穿演进                                         │
│                                                             │
│  第1节 迭代基础                                              │
│  ─────────────────────────────────────────────              │
│  → 逐行读取10GB日志文件                                      │
│  → 理解 for 循环背后的 iter/next                            │
│                                                             │
│  第2节 自定义迭代器                                          │
│  ─────────────────────────────────────────────              │
│  → LogIterator 类,按时间范围过滤                            │
│  → 实现迭代器协议                                            │
│                                                             │
│  第3节 生成器基础                                            │
│  ─────────────────────────────────────────────              │
│  → parse_logs() 解析复杂格式                                 │
│  → 用 yield 简化代码                                         │
│                                                             │
│  第4节 生成器高级特性                                        │
│  ─────────────────────────────────────────────              │
│  → yield from 合并多个日志源                                │
│  → 实现双向通信                                              │
│                                                             │
│  第5节 itertools                                             │
│  ─────────────────────────────────────────────              │
│  → 按小时分组统计错误数                                      │
│  → 高效批量处理                                              │
│                                                             │
│  第6节 异步生成器                                            │
│  ─────────────────────────────────────────────              │
│  → 异步收集多服务器日志                                      │
│  → async yield 异步流处理                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

章节导航

章节文件主题贯穿实战
0101-迭代基础.md可迭代对象、迭代器、for 循环原理filter_errors() 过滤日志错误
0202-自定义迭代器.md迭代器协议、自定义迭代器类LogIterator 按时间范围过滤
0303-生成器基础.mdyield 关键字、生成器表达式parse_logs() 解析日志格式
0404-生成器高级特性.mdsend()、throw()、close()merge_logs() 合并多源日志
0505-itertools模块.md无限迭代器、组合迭代器groupby_errors() 按小时分组
0606-异步生成器.mdasync yield、AsyncGeneratorasync_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))