
Python 迭代器的核心是迭代器协议,它不依赖特殊语法糖,而是由两个明确的方法共同定义:__iter__() 和 __next__()。只要一个对象实现了这两个方法,它就是迭代器(或可迭代对象 + 迭代器的组合)。
迭代器协议的两个关键方法
迭代器协议的本质非常简单:
-
__iter__():必须返回一个迭代器对象(通常返回self)。这个方法让对象“可被 for 循环使用”或被iter()调用。 -
__next__():每次调用时返回序列中的下一个值;当没有更多元素时,抛出StopIteration异常——这是 for 循环停止的唯一信号,不是错误,而是协议约定。
手动实现一个迭代器类
比如实现一个从 n 开始、递增到 m 的整数迭代器:
class RangeIterator:
def __init__(self, start, stop):
self.current = start
self.stop = stop
<pre class='brush:python;toolbar:false;'>def __iter__(self):
return self # 迭代器自身就是可迭代的
def __next__(self):
if self.current >= self.stop:
raise StopIteration # 触发循环结束
value = self.current
self.current += 1
return value使用
for i in RangeIterator(2, 5): print(i) # 输出 2, 3, 4
注意:__iter__() 返回 self 是常见做法(适用于迭代器本身也是可迭代对象),但也可以返回另一个迭代器实例(例如区分“可迭代对象”和“迭代器”的设计)。
立即学习“Python免费学习笔记(深入)”;
可迭代对象 vs 迭代器的区别
这是容易混淆的关键点:
-
可迭代对象(Iterable):只实现
__iter__(),返回一个迭代器。如list、str、dict。它们本身不能直接next()。 -
迭代器(Iterator):同时实现
__iter__()和__next__(),是一次性消耗品。调用一次next()后状态改变,耗尽后再次调用会持续抛出StopIteration。
验证方式:isinstance(obj, collections.abc.Iterator) 或看它能否被 next() 调用。
底层原理:for 循环其实是在调用 iter() 和 next()
写 for x in obj: 看似简洁,Python 实际执行的是:
iterator = iter(obj) # 调用 obj.__iter__()
while True:
try:
x = next(iterator) # 调用 iterator.__next__()
# 执行循环体
except StopIteration:
break # 正常退出
也就是说,for 循环、list() 构造、解包(*a)、生成式等所有迭代场景,底层都统一走这套协议。没有魔法,只有约定。










