python精讲之迭代器和生成器
在 Python 中,**迭代器(Iterator)和生成器(Generator)**都是用于处理可迭代对象的工具,它们支持惰性计算(按需生成值),能高效处理大数据流或无限序列。以下是详细解释和对比:
一、迭代器(Iterator)
核心概念
- 定义:
迭代器是实现了迭代器协议的对象,即包含__iter__()
和__next__()
方法。
-
__iter__()
:返回迭代器自身(通常就是self
)。__next__()
:返回下一个元素,若无元素则抛出StopIteration
异常。
- 特性:
-
- 惰性求值:一次只生成一个元素,节省内存。
- 单向遍历:只能前进,不能后退。
- 一次性使用:遍历结束后需重新创建才能再次迭代。
示例
# 自定义迭代器
class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationnum = self.currentself.current -= 1return num# 使用迭代器
countdown = CountDown(3)
for num in countdown:print(num) # 输出:3, 2, 1
二、生成器(Generator)
核心概念
- 定义:
生成器是一种特殊的迭代器,通过函数和yield
关键字简化创建过程。
-
- 函数中使用
yield
代替return
,每次yield
返回一个值并暂停函数状态。 - 调用生成器函数返回一个生成器对象(自动实现迭代器协议)。
- 函数中使用
- 特性:
-
- 更简洁的语法:无需手动定义
__iter__()
和__next__()
。 - 状态保存:函数局部变量和执行状态在
yield
间自动保留。 - 支持无限序列:如无限计数器。
- 更简洁的语法:无需手动定义
示例
# 生成器函数
def count_down(start):current = startwhile current > 0:yield current # 暂停并返回值current -= 1# 使用生成器
gen = count_down(3)
for num in gen:print(num) # 输出:3, 2, 1# 生成器表达式(类似列表推导式)
gen_expr = (x for x in range(3, 0, -1))
print(list(gen_expr)) # 输出:[3, 2, 1]
三、关键区别
特性 | 迭代器 (Iterator) | 生成器 (Generator) |
实现方式 | 需手动定义 | 用 |
语法复杂度 | 较复杂(需写类) | 简洁(函数形式) |
内存占用 | 低(惰性计算) | 低(惰性计算) |
适用场景 | 自定义复杂迭代逻辑 | 快速创建惰性序列 |
状态保存 | 需手动管理状态 | 自动保存函数状态 |
四、常见用法
1. 迭代文件内容(避免一次性加载大文件)
def read_large_file(file_path):with open(file_path, 'r') as file:for line in file: # 文件对象本身就是迭代器yield line.strip()for line in read_large_file("data.txt"):process(line) # 逐行处理
2. 生成无限序列
def infinite_counter():count = 0while True:yield countcount += 1gen = infinite_counter()
print(next(gen)) # 0
print(next(gen)) # 1
3. 管道式处理数据流
def filter_even(numbers):for n in numbers:if n % 2 == 0:yield ndef square(numbers):for n in numbers:yield n ** 2# 组合生成器
nums = [1, 2, 3, 4, 5]
pipeline = square(filter_even(nums))
print(list(pipeline)) # 输出:[4, 16]
五、总结
- 迭代器:基础协议,适合需要精细控制迭代逻辑的场景。
- 生成器:迭代器的语法糖,更简洁,适合快速创建惰性序列。
- 共同优势:
✅ 节省内存(处理大数据)
✅ 支持无限序列
✅ 兼容for
循环、next()
等迭代操作
通过合理使用迭代器和生成器,可以显著提升 Python 程序的效率和可读性。