检测对象是否为迭代器应使用isinstance(obj, collections.abc.Iterator),生成器可用isinstance(obj, types.GeneratorType)进一步区分,列表等可迭代对象本身不是迭代器。

要检测一个对象是生成器还是迭代器,关键不是看它“像不像”,而是看它**实际类型**和**是否满足协议**。Python 提供了明确、可靠的方法,而不是靠经验或打印结果猜测。
用 isinstance 判断是否为迭代器
所有迭代器(包括生成器)都属于 collections.abc.Iterator 类型。这是最权威的判断方式:
- 导入判断工具:
from collections.abc import Iterator - 用
isinstance(obj, Iterator)检查 - 返回 True 表示该对象确实是迭代器(含生成器)
例如:
from collections.abc import Iterator <p>def gen(): yield 1 g = gen() # 生成器函数调用返回生成器对象 print(isinstance(g, Iterator)) # True</p><p>lst = [1, 2, 3] it = iter(lst) # 手动创建的迭代器 print(isinstance(it, Iterator)) # True</p><p>print(isinstance(lst, Iterator)) # False(列表本身不是迭代器)</p>
区分普通迭代器和生成器对象
生成器是迭代器的子集,但有更具体的类型标识:
- 生成器对象的类型是
<class 'generator'> - 可直接用
type(obj) is type((i for i in []))或更简洁地:isinstance(obj, types.GeneratorType) - 需先导入:
import types
注意:不能只靠 hasattr(obj, '__next__'),因为很多类可能偶然实现该方法,但不遵循完整协议。
可迭代对象 ≠ 迭代器,别混淆
常见误判来源是把可迭代对象(如列表、字符串)当成迭代器:
- 它们只实现了
__iter__(),没实现__next__() -
isinstance(lst, Iterator)一定为 False - 但
isinstance(iter(lst), Iterator)是 True
所以,检测前务必确认你检查的是“那个对象本身”,而不是它背后的可迭代容器。
快速验证小技巧
在交互式环境里,可以结合两个动作快速定位:
- 打印类型:
print(type(obj))—— 看是不是generator或list_iterator等 - 尝试调用:
next(obj)—— 若不报错,说明它支持迭代协议;若报TypeError,大概率不是迭代器 - 再补一句:
hasattr(obj, '__iter__') and hasattr(obj, '__next__')可辅助验证协议完整性(但不如isinstance(..., Iterator)严谨)


















