Python迭代器协议___iter__与__next__解析

3次阅读

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

Python迭代器协议___iter__与__next__解析

Python 中的迭代器协议由 __iter____next__ 两个特殊方法共同定义,是实现自定义可迭代对象和迭代器的核心机制。理解它们的职责与协作关系,是掌握 for 循环、列表推导式、生成器等特性的基础。

__iter__ 方法:返回一个迭代器对象

__iter__ 是“可迭代协议”的入口。只要一个对象实现了该方法,并返回一个符合迭代器协议的对象(即带 __next__ 的对象),它就能被 forlist()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)自动实现这两个方法,是创建迭代器最简洁的方式
text=ZqhQzanResources