1. Python迭代器揭秘:for循环背后的工作机制
作为一名Python开发者,你可能每天都在使用for循环遍历列表、字典等数据结构,但很少有人真正思考过:为什么这些对象可以被for循环遍历?这背后的魔法就是迭代器(Iterator)协议。今天我们就来彻底拆解这个Python核心特性。
注意:理解迭代器协议是掌握Python高级编程的基础,它不仅是for循环的核心,也是生成器、异步编程等概念的基石。
1.1 可迭代对象 vs 迭代器
首先我们需要明确两个关键概念:
- 可迭代对象(Iterable):实现了
__iter__()方法的对象,该方法返回一个迭代器 - 迭代器(Iterator):实现了
__next__()方法的对象,该方法返回下一个元素
python复制# 判断对象是否是可迭代对象
from collections.abc import Iterable, Iterator
data = [1, 2, 3]
print(isinstance(data, Iterable)) # True
print(isinstance(data, Iterator)) # False
列表是可迭代对象但不是迭代器本身。当我们使用for循环时,Python会自动调用__iter__()方法获取迭代器:
python复制# for循环的等价实现
data = [1, 2, 3]
iterator = iter(data) # 调用data.__iter__()
while True:
try:
item = next(iterator) # 调用iterator.__next__()
print(item)
except StopIteration:
break
1.2 自定义迭代器实现
理解了原理后,我们可以自己实现一个迭代器。下面是一个生成斐波那契数列的迭代器:
python复制class Fibonacci:
def __init__(self, max_count):
self.max_count = max_count
self.count = 0
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
if self.count >= self.max_count:
raise StopIteration
value = self.a
self.a, self.b = self.b, self.a + self.b
self.count += 1
return value
# 使用示例
for num in Fibonacci(10):
print(num) # 输出前10个斐波那契数
这个实现展示了迭代器的几个关键特点:
- 同时实现了
__iter__()和__next__()方法 __iter__()返回self,因为类本身就是迭代器__next__()每次返回下一个值,结束时抛出StopIteration
1.3 迭代器的惰性求值特性
迭代器的一个重要特性是惰性求值(L
