Python中的迭代器与生成器
字数 858 2025-11-03 08:33:37
Python中的迭代器与生成器
描述
迭代器(Iterator)和生成器(Generator)是Python中用于处理可迭代对象的重要概念。迭代器允许你逐个访问容器中的元素而不暴露其底层结构,而生成器则是一种更简洁的迭代器实现方式,通过函数和yield关键字动态生成值。理解它们有助于高效处理大数据流或惰性计算场景。
1. 迭代器的基本概念
- 可迭代对象(Iterable):任何实现了
__iter__方法的对象(如列表、元组、字符串),该方法返回一个迭代器。 - 迭代器(Iterator):实现了
__iter__(返回自身)和__next__(返回下一个值,无值时抛出StopIteration异常)方法的对象。 - 示例:
my_list = [1, 2, 3] iter_obj = iter(my_list) # 等价于 my_list.__iter__() print(next(iter_obj)) # 输出 1(等价于 iter_obj.__next__()) print(next(iter_obj)) # 输出 2
2. 自定义迭代器
通过类实现迭代器协议:
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
# 使用示例
for num in Counter(0, 3):
print(num) # 输出 0, 1, 2
关键点:迭代器只能遍历一次,遍历完成后需重置才能重新使用。
3. 生成器的引入
自定义迭代器需要编写类,代码较繁琐。生成器提供了一种更简单的实现方式:
- 生成器函数:使用
yield关键字代替return,每次调用next()时执行到yield处暂停,保留状态,下次继续执行。 - 示例:
def counter_generator(start, end): current = start while current < end: yield current current += 1 gen = counter_generator(0, 3) print(next(gen)) # 输出 0 print(next(gen)) # 输出 1
生成器函数返回一个生成器对象(一种迭代器),无需手动实现__iter__和__next__。
4. 生成器的惰性计算优势
生成器按需生成值,节省内存,适合处理大规模数据流:
def infinite_sequence():
num = 0
while True:
yield num
num += 1
gen = infinite_sequence()
print(next(gen)) # 输出 0
print(next(gen)) # 输出 1
# 不会无限占用内存,每次只生成一个值
5. 生成器表达式
类似列表推导式,但使用圆括号,返回生成器对象:
squares_gen = (x**2 for x in range(5))
print(next(squares_gen)) # 输出 0
print(list(squares_gen)) # 输出 [1, 4, 9, 16](注意已消耗0)
与列表推导式(立即返回所有结果)相比,生成器表达式惰性求值,更节省内存。
6. 迭代器与生成器的区别
- 迭代器:需显式实现类协议,适合复杂状态管理。
- 生成器:通过函数和
yield简化实现,适合顺序数据流。 - 共同点:均支持
for循环和next()函数,且只能单向遍历一次。
总结
迭代器和生成器是Python惰性计算的核心工具。迭代器通过协议规范遍历行为,生成器则以其简洁语法成为更常用的实现方式,尤其在处理流式数据或无限序列时能显著提升效率。