当前位置:首页 > Python > 正文

深入理解Python中的__iter__方法(从零开始掌握可迭代对象与迭代器协议)

Python __iter__方法的学习过程中,很多初学者常常感到困惑:什么是可迭代对象?为什么有的对象可以用 for 循环遍历而有的不行?本文将带你从基础概念出发,一步步揭开 __iter__ 方法的神秘面纱,让你轻松掌握自定义迭代器的编写技巧。

什么是可迭代对象?

在 Python 中,可迭代对象(Iterable)是指那些可以被 for 循环遍历的对象,比如列表、元组、字符串、字典等。它们之所以能被遍历,是因为它们实现了 迭代器协议(Iterator Protocol)——即包含 __iter__() 方法。

深入理解Python中的__iter__方法(从零开始掌握可迭代对象与迭代器协议) Python __iter__方法  可迭代对象 迭代器协议 自定义迭代器 第1张

__iter__ 方法的作用

一个对象要成为可迭代对象,必须实现 __iter__ 方法。该方法不接受参数(除了 self),并返回一个迭代器(Iterator)。

而迭代器本身必须实现两个方法:

  • __iter__():返回迭代器自身(通常就是 return self
  • __next__():返回容器中的下一个元素;如果没有更多元素,则抛出 StopIteration 异常

简单示例:让自定义类支持 for 循环

假设我们想创建一个表示“倒计时”的类,让它可以从指定数字倒数到 1,并支持 for 循环遍历:

class Countdown:    def __init__(self, start):        self.start = start    def __iter__(self):        return CountdownIterator(self.start)class CountdownIterator:    def __init__(self, start):        self.current = start    def __iter__(self):        return self    def __next__(self):        if self.current <= 0:            raise StopIteration        value = self.current        self.current -= 1        return value# 使用示例for num in Countdown(5):    print(num)# 输出:# 5# 4# 3# 2# 1

在这个例子中,Countdown 是一个可迭代对象,它通过 __iter__ 方法返回一个独立的 CountdownIterator 实例。而 CountdownIterator 是真正的迭代器,它实现了 __iter____next__ 方法。

更简洁的方式:让同一个类既是可迭代对象又是迭代器

有时为了简化代码,我们可以让同一个类同时扮演两个角色:

class SimpleCountdown:    def __init__(self, start):        self.start = start    def __iter__(self):        self.current = self.start  # 每次迭代重置状态        return self    def __next__(self):        if self.current <= 0:            raise StopIteration        value = self.current        self.current -= 1        return value# 使用for n in SimpleCountdown(3):    print(n)# 输出:3, 2, 1

⚠️ 注意:这种方式的问题是,如果多次遍历同一个对象,第二次遍历时可能因为状态未重置而直接结束。因此,在需要多次遍历的场景中,推荐使用第一个“分离式”设计。

内置函数 iter() 与 __iter__ 的关系

当你调用 iter(obj) 时,Python 实际上是在调用 obj.__iter__()。同样,next(iterator) 会调用 iterator.__next__()

c = Countdown(3)iterator = iter(c)  # 等价于 c.__iter__()print(next(iterator))  # 3print(next(iterator))  # 2

总结

通过本文,你已经掌握了 Python __iter__方法 的核心原理。记住以下关键点:

  • 可迭代对象必须实现 __iter__ 方法
  • 迭代器必须实现 __iter__(返回自身)和 __next__(返回下一值)
  • 良好的设计应区分“可迭代对象”和“迭代器”,以支持多次遍历
  • 这是 迭代器协议 的核心,也是理解生成器、上下文管理器等高级特性的基础

现在,你可以自信地编写自己的 自定义迭代器 了!无论是处理数据流、模拟序列,还是构建领域特定的遍历逻辑,__iter__ 都是你不可或缺的工具。