Python的for循环能遍历对象是因为它们遵循迭代器协议:实现__iter__()返回迭代器,且迭代器实现__next__();for循环本质是iter()加next()的语法糖。
Python 中的 for 循环之所以能遍历列表、字符串、字典等对象,不是因为它们“天生支持循环”,而是因为这些对象遵循了统一的迭代器协议——这是 Python 迭代机制的底层规则。
迭代器协议是一组约定:只要一个
对象实现了 __iter__() 方法(返回一个迭代器),并且该迭代器实现了 __next__() 方法(返回下一个元素,耗尽时抛出 StopIteration),它就能被 for 循环使用。
注意:__iter__() 返回的必须是迭代器对象(即自身也实现 __next__()),而不是任意可调用对象。
写一句 for x in obj:,Python 解释器在背后自动执行以下逻辑:
iter(obj),即触发 obj.__iter__(),获取一个迭代器next(iterator)(即 iterator.__next__())获取下一个值StopIteration 异常,就终止循环,不报错也就是说,for 循环本质是「隐式调用 iter + 「显式处理 StopIteration」的语法糖。
下面这段代码和 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 让这个过程更简洁、安全。
可迭代对象(Iterable):有 __iter__(),能产生迭代器(如 list, str, dict)。它本身不一定能被 next() 调用。
迭代器(Iterator):既有 __iter__()(通常返回自己),又有 __next__()。它是“一次性的”——遍历完就不能重来(除非重新创建)。
验证方式:
iter(obj) 不报错 → 是可迭代对象next(iter(obj)) 不报错 → 返回的是有效迭代器isinstance(obj, collections.abc.Iterator) → 判断是否为迭代器(需先 import collections)