Python如何写一个可迭代对象
在Python中,“可迭代对象”是理解迭代器协议的核心概念。本文将通过原理讲解+代码示例,带你掌握自定义可迭代对象的完整方法,并揭示Python中for...in循环的底层机制。
一、核心概念:迭代器协议
Python的迭代机制基于两个魔法方法:
__iter__:返回一个迭代器对象(自身或另一个对象)__next__:迭代器对象必须实现的下一个值获取方法
符合此协议的对象即可被for循环、list()等内置函数消费。
二、基础实现:斐波那契数列生成器
class Fibonacci:def __init__(self, max_count):self.max_count = max_countself.count = 0self.a, self.b = 0, 1def __iter__(self):return self # 返回自身作为迭代器def __next__(self):if self.count >= self.max_count:raise StopIterationself.count += 1value = self.aself.a, self.b = self.b, self.a + self.breturn value# 验证
fib = Fibonacci(5)
for num in fib:print(num) # 输出: 0 1 1 2 3
三、进阶技巧:生成器表达式
使用生成器函数可简化迭代器创建:
def fib_generator(n):a, b = 0, 1for _ in range(n):yield aa, b = b, a + b# 等效于
fib = fib_generator(5)
print(list(fib)) # [0, 1, 1, 2, 3]
四、高级应用:链式迭代器
实现可多次迭代的对象:
class ReIterable:def __init__(self, data):self.data = datadef __iter__(self):return iter(self.data) # 返回新迭代器实例# 验证
data = ReIterable([1, 2, 3])
print(list(data)) # [1, 2, 3]
print(list(data)) # 仍可迭代
五、注意事项
- 状态管理:迭代器需维护自身状态,避免共享
- 异常处理:正确抛出
StopIteration而非返回 - 生成器优化:对简单场景优先使用生成器表达式
- 类型检查:使用
isinstance(obj, collections.abc.Iterable)验证
六、底层原理
当执行for x in obj时,Python实际执行:
iterator = iter(obj) # 调用__iter__
while True:try:x = next(iterator) # 调用__next__# 执行循环体except StopIteration:break
通过实现迭代器协议,我们可以创建能被Python原生循环机制消费的对象,这是理解装饰器、上下文管理器等高级特性的重要基础。
