Python的for循环能遍历对象是因为它们遵循迭代器协议:实现__iter__()返回迭代器,且迭代器实现__next__();for循环本质是iter()加next()的语法糖。

Python 中的 for 循环之所以能遍历列表、字符串、字典等对象,不是因为它们“天生支持循环”,而是因为这些对象遵循了统一的迭代器协议——这是 Python 迭代机制的底层规则。
什么是迭代器协议?
迭代器协议是一组约定:只要一个对象实现了 __iter__() 方法(返回一个迭代器),并且该迭代器实现了 __next__() 方法(返回下一个元素,耗尽时抛出 StopIteration),它就能被 for 循环使用。
注意:__iter__() 返回的必须是迭代器对象(即自身也实现 __next__()),而不是任意可调用对象。
for 循环实际做了什么?
写一句 for x in obj:,Python 解释器在背后自动执行以下逻辑:
立即学习“Python免费学习笔记(深入)”;
- 调用
iter(obj),即触发obj.__iter__(),获取一个迭代器 - 反复调用
next(iterator)(即iterator.__next__())获取下一个值 - 一旦捕获到
StopIteration异常,就终止循环,不报错
也就是说,for 循环本质是「隐式调用 iter + 「显式处理 StopIteration」的语法糖。
手动模拟 for 循环(加深理解)
下面这段代码和 for i in [1,2,3]: print(i) 行为完全一致:
it = iter([1, 2, 3])
while True:
try:
i = next(it)
print(i)
except StopIteration:
break
这说明:没有 for 也能迭代;而 for 让这个过程更简洁、安全。
可迭代对象 vs 迭代器:关键区别
可迭代对象(Iterable):有 __iter__(),能产生迭代器(如 list, str, dict)。它本身不一定能被 next() 调用。
迭代器(Iterator):既有 __iter__()(通常返回自己),又有 __next__()。它是“一次性的”——遍历完就不能重来(除非重新创建)。
验证方式:
-
iter(obj)不报错 → 是可迭代对象 -
next(iter(obj))不报错 → 返回的是有效迭代器 -
isinstance(obj, collections.abc.Iterator)→ 判断是否为迭代器(需先import collections)










