目录
1. 引言
在 Python 中,迭代器 和 生成器 是用于处理可迭代对象(如列表、元组、字典等)的两种重要机制。
- 迭代器(Iterator):提供一种按需访问元素的方法,并避免一次性加载整个数据集。
- 生成器(Generator):是一种特殊的迭代器,使用
yield
语句返回数据,支持惰性计算,减少内存开销。
本教程将详细介绍 迭代器和生成器 的工作原理、使用方式和应用场景。
2. Python 迭代器
2.1 什么是迭代器?
Python 的迭代器是 实现了 __iter__()
和 __next__()
方法的对象,用于逐步访问数据,而不会一次性将所有数据加载到内存中。
2.2 迭代器的工作原理
Python 中的可迭代对象(如 list
, tuple
, dict
, set
)可以使用 iter()
方法转换为迭代器,然后通过 next()
方法获取元素。
numbers = [1, 2, 3, 4]
iterator = iter(numbers) # 获取迭代器
print(next(iterator)) # 输出: 1
print(next(iterator)) # 输出: 2
print(next(iterator)) # 输出: 3
print(next(iterator)) # 输出: 4
当迭代器没有更多元素可供迭代时,会引发 StopIteration
异常。
2.3 创建自定义迭代器
可以通过 类 自定义一个迭代器,实现 __iter__()
和 __next__()
方法。
class Counter:
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 # 终止迭代
value = self.current
self.current += 1
return value
counter = Counter(1, 5)
for num in counter:
print(num) # 输出: 1 2 3 4
3. Python 生成器
3.1 什么是生成器?
生成器(Generator)是一种特殊的迭代器,它 不会一次性生成所有数据,而是 每次调用 next()
时才计算并返回下一个值。
Python 生成器的特点:
- 使用
yield
关键字,不需要定义__iter__()
和__next__()
。 - 支持状态保存,每次执行
yield
,函数暂停,下一次继续执行。 - 减少内存消耗,适用于大规模数据处理。
3.2 生成器的语法
使用 yield
关键字定义生成器。
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
当没有更多值可 yield
时,会引发 StopIteration
。
3.3 生成器与 return
的区别
return
直接终止函数,而yield
会暂停并保存函数状态。return
只能返回一次值,而yield
可以多次产生值。
def with_return():
return "Hello"
return "World" # 这一行永远不会执行
print(with_return()) # 输出: Hello
def with_yield():
yield "Hello"
yield "World"
gen = with_yield()
print(next(gen)) # 输出: Hello
print(next(gen)) # 输出: World
3.4 生成器的状态控制
使用 send()
方法可以向生成器发送值,并恢复执行。
def generator_with_send():
value = yield "Start"
yield f"Received: {value}"
gen = generator_with_send()
print(next(gen)) # 输出: Start
print(gen.send("Hello")) # 输出: Received: Hello
4. 迭代器 vs 生成器
特性 | 迭代器 | 生成器 |
---|---|---|
语法 | 需要实现 __iter__() 和 __next__() | 使用 yield |
内存占用 | 可能较高 | 仅按需生成数据 |
可读性 | 代码较复杂 | 代码简洁 |
应用场景 | 适用于自定义迭代逻辑 | 适用于大数据流 |
5. 完整示例
自定义迭代器 vs 生成器
# 自定义迭代器
class FibonacciIterator:
def __init__(self, max_num):
self.a, self.b = 0, 1
self.max_num = max_num
def __iter__(self):
return self
def __next__(self):
if self.a > self.max_num:
raise StopIteration
value = self.a
self.a, self.b = self.b, self.a + self.b
return value
# 生成器版本
def fibonacci_generator(max_num):
a, b = 0, 1
while a <= max_num:
yield a
a, b = b, a + b
# 使用迭代器
print("Iterator:")
for num in FibonacciIterator(10):
print(num, end=" ") # 输出: 0 1 1 2 3 5 8
print("\nGenerator:")
# 使用生成器
for num in fibonacci_generator(10):
print(num, end=" ") # 输出: 0 1 1 2 3 5 8
6. 结论
- 迭代器:适用于需要更复杂迭代逻辑的情况,需实现
__iter__()
和__next__()
。 - 生成器:更简洁的迭代方式,适用于流式数据处理,降低内存消耗。
- 推荐使用生成器,除非自定义需求较高。
7. 参考资料
- Python 官方文档 – 迭代器与生成器:https://docs.python.org/3/tutorial/classes.html#iterators
- Real Python – Generators:https://realpython.com/introduction-to-python-generators/
- W3Schools – Python Generators:https://www.w3schools.com/python/python_generators.asp
站内链接:
发表回复