Python3 迭代器与生成器
Python3 迭代器与生成器(Iterators & Generators)
🎯 学习目标
掌握 Python 中迭代器(Iterator)和生成器(Generator)的基本概念、实现方式及其在处理大数据、惰性求值、节省内存等方面的优势。能够在实际项目中灵活使用迭代器和生成器优化程序性能,提升代码可读性和效率。
🔑 核心重点
分类 | 内容 |
---|---|
基本概念 | 迭代器是访问集合元素的方式;生成器用于按需生成数据 |
实现方式 | 使用 __iter__ 和 __next__ 方法定义迭代器;使用 yield 定义生成器函数 |
惰性求值 | 生成器只在需要时计算下一个值,适合处理大数据流 |
实际应用场景 | 大文件读取、日志分析、网络爬虫、无限序列、批量任务调度等 |
性能优势 | 相比列表更节省内存,适合大规模数据集 |
📚 详细讲解
一、什么是迭代器(Iterator)?
迭代器是一个可以记住遍历位置的对象,它不依赖索引机制,适用于任何可遍历的数据结构。
✅ 迭代器的两个核心方法:
__iter__()
:返回迭代器对象本身__next__()
:返回容器中的下一个元素,没有则抛出StopIteration
✅ 示例:
my_list = [1, 2, 3]
it = iter(my_list)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# print(next(it)) # 抛出 StopIteration
📌 所有实现了这两个方法的对象都被称为可迭代对象(Iterable),如 list
, dict
, str
, tuple
, set
, file
等。
二、自定义迭代器
可以通过定义类来实现自己的迭代器。
✅ 示例:从 1 到 N 的计数器
class MyRange:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current < self.end:
num = self.current
self.current += 1
return num
else:
raise StopIteration
for n in MyRange(0, 5):
print(n)
三、什么是生成器(Generator)?
生成器是一种特殊的迭代器,由带有 yield
关键字的函数创建,每次调用会“记住”执行状态,直到下一次 next()
被调用。
✅ 示例:简单的生成器
def simple_generator():
yield "First"
yield "Second"
yield "Third"
gen = simple_generator()
print(next(gen)) # First
print(next(gen)) # Second
print(next(gen)) # Third
📌 生成器函数 vs 普通函数:
- 普通函数通过
return
返回结果并结束 - 生成器函数通过
yield
暂停执行并保存状态
四、生成器表达式(Generator Expression)
类似于列表推导式,但使用 ()
而不是 []
,返回一个生成器对象。
✅ 示例:
nums = (x**2 for x in range(10))
for num in nums:
print(num)
📌 优点:不会立即生成整个列表,节省内存空间,尤其适合大数据处理。
五、生成器的实际应用
✅ 应用1:逐行读取大文件
def read_large_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
yield line.strip()
for line in read_large_file('big_data.txt'):
print(line)
📌 优势:避免一次性将整个文件加载到内存中。
✅ 应用2:无限序列生成器(如斐波那契数列)
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for _ in range(10):
print(next(fib))
📌 输出示例:
0
1
1
2
3
5
8
13
21
34
⚠️ 注意事项
- 不要滥用
yield
,确保逻辑清晰易理解 - 生成器只能遍历一次,不能重复使用
- 使用生成器处理大数据时注意资源释放(如文件句柄)
- 避免在生成器中进行耗时操作影响主流程
for
循环内部自动处理StopIteration
异常
🧪 实际案例分析
📌 场景:模拟日志实时监控系统
我们有一个不断追加写入的日志文件 app.log
,希望实时读取新增内容。
import time
def follow(file):
file.seek(0, 2) # 移动到文件末尾
while True:
line = file.readline()
if not line:
time.sleep(0.1) # 等待新内容
continue
yield line
with open("app.log", "r") as f:
for line in follow(f):
print(line.strip())
📌 说明:
- 使用生成器持续监听新日志
- 不占用大量内存,适合长期运行的服务
- 可结合多线程/异步框架构建完整日志分析系统
🧩 拓展练习(动手实践)
- 编写一个生成器函数,生成所有小于 N 的质数。
- 实现一个迭代器类,模拟队列行为(先进先出)。
- 使用生成器读取 CSV 文件,按行返回每条记录。
- 编写一个函数,接收一个整数列表,返回一个生成器,仅返回偶数。
- 设计一个文本过滤器,使用生成器逐行读取文件并过滤包含特定关键词的行。
📚 推荐阅读
- Python 官方文档 - 迭代器
- 《流畅的 Python》第 7 章 - 迭代器与生成器
- 廖雪峰 Python 教程 - 迭代器
- 菜鸟教程 - Python 迭代器与生成器
- Real Python - Iterators and Generators in Python
🧭 下一步建议
- 下一章学习内容:《Python 函数详解(下)—— 高阶函数与装饰器》
- 掌握函数作为参数传递、闭包、装饰器原理与应用
- 学习
map()
,filter()
,reduce()
等高阶函数 - 探索函数嵌套、柯里化、偏函数等高级技巧
- 结合迭代器与函数知识,尝试编写模块化、可复用性强的工具函数库
如果你希望我为你提供:
- Python 迭代器与生成器速查表 PDF(含示例)
- 更多实战项目练习题(如日志监控器、无限数列生成器、CSV 处理器等)
- 高级生成器技巧详解(如协程、状态保持、组合多个生成器)
- 视频教学资源推荐(中文讲解)
欢迎随时告诉我 😊