判断一个对象是否为迭代器,核心是确认其同时实现__iter__()(返回自身)和__next__()(返回元素或抛stopiteration)方法;最规范方式是用isinstance(obj, collections.abc.iterator),它严格验证完整协议,而列表、字符串等仅是可迭代对象而非迭代器。

判断一个对象是否具有 Iterator 协议,核心是确认它是否真正实现了迭代器接口:即同时具备 __iter__ 方法(返回自身)和 __next__ 方法(逐次返回元素,耗尽时抛出 StopIteration)。这与“可迭代对象”(Iterable)不同——后者只需支持 iter(),而 Iterator 是 Iterable 的子集,且必须能被反复调用 next()。
用 collections.abc.Iterator 做类型检查
这是最规范、推荐的方式,符合 Python 官方定义,能正确识别标准迭代器(如 list_iterator、range_iterator、生成器对象等),也支持用户类显式继承或注册:
- 导入
from collections.abc import Iterator - 调用
isinstance(obj, Iterator) - 注意:该检查会验证对象是否满足完整迭代器协议,不是仅看是否有
__next__属性
手动验证 __iter__ 和 __next__ 行为
适用于调试或受限环境(如无法导入 abc 模块),但需谨慎执行:
- 检查
hasattr(obj, '__iter__')且callable(getattr(obj, '__iter__')),再确认obj.__iter__()返回的是obj本身(而非新对象) - 检查
hasattr(obj, '__next__')且callable(getattr(obj, '__next__')) - 尝试调用一次
next(obj),不抛异常才说明基本可用;但注意这会推进状态,不适合只做判断
避免常见误判
很多对象看似“能 next”,实则不符合 Iterator 协议:
-
list、str、dict是 Iterable,但不是 Iterator ——isinstance([], Iterator)返回False - 自定义类若只实现
__next__但没让__iter__返回自身,不算合法 Iterator - 不要用
iter(obj)是否成功来判断是否为 Iterator:它对任何 Iterable 都返回一个新迭代器,而非原对象
区分 Iterator 和 Iterable 很关键
Iterator 必然可迭代(isinstance(it, Iterator) → True 意味着 isinstance(it, Iterable) 也为 True),但反过来不成立。例如:
-
iter([1,2,3])返回的list_iterator对象是 Iterator -
[1,2,3]本身只是 Iterable,不是 Iterator - 生成器函数返回的对象(如
(x for x in range(3)))既是 Iterable 也是 Iterator











