Python迭代器协议是什么___iter__实现说明

7次阅读

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

Python迭代器协议是什么___iter__实现说明

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._itemsdef __iter__(self): for x in self._items: yield x

与 __next__ 的配合关系

__iter__ 只管“开局”,真正逐个产出元素靠 __next__。每次调用 next(iterator) 就触发一次 __next__;当无更多元素时,__next__ 必须抛出 StopIteration 异常——这是迭代结束的唯一合法信号。

  • 不能靠返回 None 或特殊值标记结束,否则 for 循环不会停止
  • 生成器函数自动处理 StopIteration,所以用 yield 实现时无需手动抛出
text=ZqhQzanResources