__iter__方法必须返回迭代器对象,负责提供可迭代能力而非直接返回元素;常见实现有委托内置迭代器、返回自身(需实现__next__)和返回生成器三种模式。

Python迭代器协议是一套约定,规定了对象如何被 for 循环、list()、next() 等内置操作识别和使用——核心是实现 __iter__ 和(通常)__next__ 两个特殊方法。
__iter__ 方法的作用
__iter__ 是迭代器协议的入口方法,必须返回一个**迭代器对象**(即实现了 __next__ 方法的对象)。它不负责逐个返回元素,只负责“提供能迭代的东西”。
- 如果对象本身已是迭代器(如自定义类既要可迭代又要记录当前状态),
__iter__通常直接返回self - 如果对象是容器(如列表、字典),
__iter__一般返回其内部数据的迭代器,例如return iter(self._data) - 不能返回普通值(如数字、字符串本身),也不能返回生成器函数(需调用后才得生成器对象);但可以返回生成器函数的调用结果:
return self._gen()(其中_gen是带yield的函数)
为什么 __iter__ 返回迭代器,而不是直接返回元素?
这是为了分离“可迭代对象”和“迭代器”的职责。前者表示“能被遍历”,后者表示“正在遍历的状态”。比如一个列表可被多次遍历,每次 for 都调用 __iter__ 得到一个新迭代器,互不影响。
- 若
__iter__错误地返回元素(如return self._items[0]),会触发TypeError: iter() returned non-iterator - 若返回自身但没实现
__next__,调用next(iter(obj))会报TypeError: 'X' object is not an iterator
常见实现模式
有三种典型写法,按场景选择:
立即学习“Python免费学习笔记(深入)”;
-
委托给内置迭代器:适合封装容器,简洁安全
def __iter__(self): return iter(self._items) -
返回自身 + 实现 __next__:适合需要维护遍历状态的迭代器类
def __iter__(self): return self,并在类中定义__next__(self)控制逻辑 -
返回生成器:最常用、最简洁的惰性计算方式
def __iter__(self): yield from self._items或def __iter__(self): for x in self._items: yield x
与 __next__ 的配合关系
__iter__ 只管“开局”,真正逐个产出元素靠 __next__。每次调用 next(iterator) 就触发一次 __next__;当无更多元素时,__next__ 必须抛出 StopIteration 异常——这是迭代结束的唯一合法信号。
- 不能靠返回
None或特殊值标记结束,否则for循环不会停止 - 生成器函数自动处理
StopIteration,所以用yield实现时无需手动抛出










