python迭代器与生成器
迭代器(Iterator)与生成器(Generator)的区别与联系
在Python中,迭代器和生成器都是用于遍历数据的工具,它们密切相关但又有明显区别。理解它们的异同,有助于更好地编写高效、优雅的代码。
目录
- 迭代器和生成器的定义
- 迭代器与生成器的联系
- 迭代器与生成器的区别
- 何时使用迭代器,何时使用生成器
- 总结
迭代器和生成器的定义
-
迭代器(Iterator):实现了迭代协议的对象,必须包含
__iter__()和__next__()方法。它可以逐个返回容器中的元素,直到没有元素时抛出StopIteration异常。 -
生成器(Generator):一种特殊的迭代器,由生成器函数(包含
yield语句的函数)或生成器表达式创建。生成器自动实现了迭代器协议,简化了迭代器的编写。
迭代器与生成器的联系
-
生成器是迭代器的一种
生成器本质上是迭代器,满足迭代器协议,支持__iter__()和__next__()方法。 -
都支持惰性求值
两者都不会一次性生成所有数据,而是按需生成,节省内存。 -
都可以用于
for循环和其他迭代上下文
例如list()、sum()等函数都可以接受迭代器和生成器。
迭代器与生成器的区别
| 特性 | 迭代器(Iterator) | 生成器(Generator) |
|---|---|---|
| 创建方式 | 通过实现__iter__()和__next__()方法的类 |
通过包含yield的函数或生成器表达式创建 |
| 代码复杂度 | 需要手动维护状态,代码较复杂 | 由Python自动维护状态,代码简洁 |
| 语法支持 | 无特殊语法,需要手动实现 | 使用yield关键字,语法简洁 |
| 适用场景 | 复杂迭代逻辑或自定义数据结构 | 简单序列生成、流式数据处理、惰性计算 |
| 可读性 | 代码较冗长 | 代码简洁,易读 |
| 资源管理 | 需要手动管理状态和异常 | Python自动管理状态和异常 |
何时使用迭代器,何时使用生成器?
-
使用迭代器
- 需要实现复杂的迭代逻辑
- 需要自定义数据结构的遍历方式
- 需要更细粒度的控制迭代过程
-
使用生成器
- 需要快速实现简单的迭代器
- 处理流式数据或大数据集
- 惰性计算,节省内存
- 代码追求简洁和可读性
示例对比
迭代器实现
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:
raise StopIteration
val = self.current
self.current += 1
return val
for num in MyRange(1, 5):
print(num)
生成器实现
def my_range(start, end):
current = start
while current < end:
yield current
current += 1
for num in my_range(1, 5):
print(num)
两者输出相同,但生成器代码更简洁。
总结
- 生成器是迭代器的简化写法,通过
yield自动实现迭代协议。 - 迭代器需要手动实现
__iter__()和__next__()方法,适合复杂场景。 - 生成器代码简洁,适合大多数迭代需求。
- 理解两者的区别和联系,有助于选择合适的工具编写高效Python代码。

浙公网安备 33010602011771号