Python迭代器怎么实现_迭代器协议底层原理

2次阅读

Python迭代器怎么实现_迭代器协议底层原理

python 迭代器的核心是迭代器协议,它不依赖特殊语法糖,而是由两个明确的方法共同定义:__iter__()__next__()。只要一个对象实现了这两个方法,它就是迭代器(或可迭代对象 + 迭代器的组合)。

迭代器协议的两个关键方法

迭代器协议的本质非常简单:

  • __iter__():必须返回一个迭代器对象(通常返回 self)。这个方法让对象“可被 for 循环使用”或被 iter() 调用。
  • __next__():每次调用时返回序列中的下一个值;当没有更多元素时,抛出 StopIteration 异常——这是 for 循环停止的唯一信号,不是错误,而是协议约定。

手动实现一个迭代器类

比如实现一个从 n 开始、递增到 m 的整数迭代器:

class RangeIterator:     def __init__(self, start, stop):         self.current = start         self.stop = stop <pre class='brush:python;toolbar:false;'>def __iter__(self):     return self  # 迭代器自身就是可迭代的  def __next__(self):     if self.current >= self.stop:         raise StopIteration  # 触发循环结束     value = self.current     self.current += 1     return value

使用

for i in RangeIterator(2, 5): print(i) # 输出 2, 3, 4

注意:__iter__() 返回 self 是常见做法(适用于迭代器本身也是可迭代对象),但也可以返回另一个迭代器实例(例如区分“可迭代对象”和“迭代器”的设计)。

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

可迭代对象 vs 迭代器的区别

这是容易混淆的关键点:

  • 可迭代对象(Iterable):只实现 __iter__(),返回一个迭代器。如 liststrdict。它们本身不能直接 next()
  • 迭代器(Iterator):同时实现 __iter__()__next__(),是一次性消耗品。调用一次 next() 后状态改变,耗尽后再次调用会持续抛出 StopIteration

验证方式:isinstance(obj, collections.abc.Iterator) 或看它能否被 next() 调用。

底层原理:for 循环其实是在调用 iter() 和 next()

for x in obj: 看似简洁,Python 实际执行的是:

iterator = iter(obj)  # 调用 obj.__iter__() while True:     try:         x = next(iterator)  # 调用 iterator.__next__()         # 执行循环体     except StopIteration:         break  # 正常退出

也就是说,for 循环、list() 构造、解包(*a)、生成式等所有迭代场景,底层都统一走这套协议。没有魔法,只有约定。

text=ZqhQzanResources