python迭代器协议由__iter__和__next__共同定义:__iter__返回迭代器对象,__next__返回下一元素或抛出stopiteration;二者协作支撑for循环等语法。

Python 中的迭代器协议由 __iter__ 和 __next__ 两个特殊方法共同定义,是实现自定义可迭代对象和迭代器的核心机制。理解它们的职责与协作关系,是掌握 for 循环、列表推导式、生成器等特性的基础。
__iter__ 方法:返回一个迭代器对象
__iter__ 是“可迭代协议”的入口。只要一个对象实现了该方法,并返回一个符合迭代器协议的对象(即带 __next__ 的对象),它就能被 for、list()、tuple() 等函数使用。
- 对于容器类(如自定义列表、树结构),
__iter__通常返回一个新的迭代器实例(避免多个循环互相干扰) - 对于迭代器自身,
__iter__习惯性地返回self(因为迭代器也是可迭代的) - 不能返回普通值(如数字、字符串),必须返回实现了
__next__的对象
__next__ 方法:返回下一个元素或抛出 StopIteration
__next__ 定义了“如何一步步取值”。每次调用它,应返回序列中的下一个元素;当没有更多元素时,必须显式 raise StopIteration 异常——这是 Python 迭代结束的唯一标准信号。
- 不能静默返回
None或其他占位值,否则 for 循环会无限执行 - 多次调用
__next__应体现状态变化(如移动内部指针、更新索引) - 一旦抛出
StopIteration,后续再调用__next__通常仍应抛出该异常(不重置)
二者协作:for 循环背后的自动调用链
当你写 for x in obj:,Python 实际执行的是:
立即学习“Python免费学习笔记(深入)”;
- 先调用
iter(obj)→ 触发obj.__iter__() - 反复调用
next(iterator)→ 触发iterator.__next__() - 直到捕获
StopIteration,循环自然退出
例如,一个简单计数迭代器:
class Countdown:def __init__(self, start):
self.start = start
def __iter__(self):
return self # 迭代器就是自身
def __next__(self):
if self.start raise StopIteration
self.start -= 1
return self.start + 1
常见误区与注意事项
-
__iter__返回的是迭代器,不是数据本身;混淆会导致TypeError: 'X' object is not an iterator - 迭代器只能单向遍历一次,用完即废;需要重复遍历时,应在
__iter__中返回新实例 - 内置类型(如 list、dict)的
__iter__返回的是独立的迭代器对象,所以支持多路并发遍历 - 生成器函数(含
yield)自动实现这两个方法,是创建迭代器最简洁的方式










