python自定义迭代器核心是实现__iter__和__next__方法:__iter__必须返回迭代器对象(通常return self),__next__必须显式raise stopiteration终止迭代,并独立维护实例状态。

Python 中实现自定义迭代器,核心就是让类同时具备 __iter__ 和 __next__ 方法,且行为符合迭代协议——否则 for 循环或 next() 会直接报错。
为什么 __iter__ 必须返回自身(或另一个迭代器)
因为 for 循环内部会先调用 iter(obj),而该函数要求返回一个实现了 __next__ 的对象。如果 __iter__ 返回别的东西(比如 list 或 None),就会触发 TypeError: iter() returned non-iterator。
-
__iter__通常只需写成return self(适用于单次遍历场景) - 如果想支持多次遍历(如多次
for循环),__iter__应返回一个新实例,或重置内部状态(如把计数器归零) - 返回其他迭代器(如
iter(self._data))也合法,但那就不是“自定义迭代逻辑”了
__next__ 必须手动抛出 StopIteration
这是最常踩的坑:__next__ 不能靠函数自然结束来退出,必须显式 raise StopIteration。否则迭代永远不会停止,for 会无限循环,next() 会持续返回 None 或引发意外错误。
- 在逻辑末尾加
raise StopIteration是硬性要求 - 不要用
return代替;return(无值)等价于return None,不会终止迭代 - 若依赖外部数据源(如文件、网络流),需在每次取值前检查是否耗尽,再决定是否 raise
状态管理容易被忽略:多个迭代器实例互不干扰
每个迭代器对象必须维护独立的状态(如当前索引、已读字节数)。如果把状态存在类变量(cls.counter)或全局变量里,多个 for 循环或并发调用就会互相污染。
- 状态变量(如
self._index)必须在__init__中初始化,且只在当前实例内修改 - 如果需要“可重入”,即同一个对象能被多次
for,就在__iter__里重置状态,而不是在__init__里一次性固定 - 注意:内置容器(如
list)每次iter()都返回新迭代器,所以天然隔离;你的类要模仿这点,就得在__iter__里做点事
真正难的不是写这两个方法,而是想清楚:这个迭代器到底代表什么过程?它的“完成条件”是什么?状态怎么才算“干净地复位”?这些决定了 __iter__ 和 __next__ 的耦合方式和边界处理逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











