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

Python 中 __next__ 方法是迭代器协议的核心,它不单独运行,而是由 next() 函数或 for 循环隐式调用,每次返回迭代中的下一个值,直到耗尽时抛出 StopIteration 异常。
__next__ 的触发时机
__next__ 不会在对象创建时自动执行,只在明确请求下一个元素时被调用:
- 显式调用
next(iterator) -
for item in iterator:每次循环开始前内部调用next() -
list(iterator)、tuple(iterator)等构造函数会持续调用直到异常
执行流程关键步骤
一次 __next__ 调用的典型流程如下:
- 检查当前状态是否已到末尾(如索引越界、数据取完)
- 若未结束:计算/取出下一个值,更新内部状态(如递增索引、移动指针)
- 返回该值
- 若已结束:主动 raise
StopIteration(不能返回None或静默退出)
常见错误与注意事项
实现 __next__ 时容易忽略的细节:
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
立即学习“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 迭代机制的脉络。









