Python __next__执行流程_迭代过程解析

__next__ 方法是迭代器协议核心,由 next() 或 for 循环隐式调用,返回下一个值,耗尽时必须显式抛出 stopiteration 异常。

Python __next__执行流程_迭代过程解析

Python 中 __next__ 方法是迭代器协议的核心,它不单独运行,而是由 next() 函数或 for 循环隐式调用,每次返回迭代中的下一个值,直到耗尽时抛出 StopIteration 异常。

__next__ 的触发时机

__next__ 不会在对象创建时自动执行,只在明确请求下一个元素时被调用:

  • 显式调用 next(iterator)
  • for item in iterator: 每次循环开始前内部调用 next()
  • list(iterator)tuple(iterator) 等构造函数会持续调用直到异常

执行流程关键步骤

一次 __next__ 调用的典型流程如下:

  • 检查当前状态是否已到末尾(如索引越界、数据取完)
  • 若未结束:计算/取出下一个值,更新内部状态(如递增索引、移动指针)
  • 返回该值
  • 若已结束:主动 raise StopIteration(不能返回 None 或静默退出)

常见错误与注意事项

实现 __next__ 时容易忽略的细节:

立即学习Python免费学习笔记(深入)”;

  • 必须配合 __iter__ 方法(通常返回 self),否则对象不可迭代
  • 多次调用 __iter__ 应返回新迭代器(避免复用已耗尽的实例)
  • 不能在 __next__ 中吞掉 StopIteration,否则 for 循环不会终止
  • 状态管理要清晰——例如列表迭代器需记录当前索引,文件迭代器需维护文件位置

一个手动模拟的例子

以下是一个简易计数迭代器,直观体现 __next__ 如何逐步推进:

 class Counter:     def __init__(self, start, stop):         self.current = start         self.stop = stop <pre class='brush:python;toolbar:false;'>def __iter__(self):     return self  # 返回自身,支持 for 循环  def __next__(self):     if self.current >= self.stop:         raise StopIteration     value = self.current     self.current += 1     return value

使用:

c = Counter(2, 5) print(next(c)) # → 2 print(next(c)) # → 3 print(next(c)) # → 4 print(next(c)) # → StopIteration

这个过程本质是状态驱动的单步推进,__next__ 就是每一步的执行入口。理解它,就抓住了 Python 迭代机制的脉络。