在Python __iter__方法的学习过程中,很多初学者常常感到困惑:什么是可迭代对象?为什么有的对象可以用 for 循环遍历而有的不行?本文将带你从基础概念出发,一步步揭开 __iter__ 方法的神秘面纱,让你轻松掌握自定义迭代器的编写技巧。
在 Python 中,可迭代对象(Iterable)是指那些可以被 for 循环遍历的对象,比如列表、元组、字符串、字典等。它们之所以能被遍历,是因为它们实现了 迭代器协议(Iterator Protocol)——即包含 __iter__() 方法。

一个对象要成为可迭代对象,必须实现 __iter__ 方法。该方法不接受参数(除了 self),并返回一个迭代器(Iterator)。
而迭代器本身必须实现两个方法:
__iter__():返回迭代器自身(通常就是 return self)__next__():返回容器中的下一个元素;如果没有更多元素,则抛出 StopIteration 异常假设我们想创建一个表示“倒计时”的类,让它可以从指定数字倒数到 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(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__ 都是你不可或缺的工具。
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210590.html