什么是迭代器?
简单来讲当一个Python对象实现了iter方法或getitem方法与next方法,那么它就是一个迭代器。
什么是可迭代对象?
只要对象实现了iter方法,那它就是一个可迭代对象。如果对象实现了getitem方法,则会变成一个可迭代对象。也就是说,迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器。
iter的作用:
当解释器开始迭代对象时,会先检查对象是否实现了iter方法,如果实现了,就调用iter方法,返回当前对象的迭代器类的实例,获得一个迭代器。
如果没有实现iter方法,但是实现了getitem方法,python会创建一个迭代器,尝试按顺序(从索引0开始)获取元素。
如果都没有实现,python会抛出TypeError异常,通常会提示"object is not iterable" 。
next的作用:
- 返回迭代器中的下一个可用元素
- 如果没有元素,抛出StopIteration异常
- 可迭代的对象必须实现iter方法,但不能实现next方法
通过方法判断迭代器与可迭代对象:
isinstance()函数是用来判断一个对象是否是一个已知的类型。isinstance()与type() 区别是,isinstance()会考虑继承关系。所以说,要判断两个类型是否相同推荐使用isinstance()。
collections.abc模块定义了一些抽象基类,它们可用于判断一个具体类是否具有某一特定的接口。结合isinstance()使用就可以判断对象是否为迭代器或可迭代对象
# Iterable用于判断对象是否为可迭代对象
# Iterator用于判断对象是否为迭代器
from collections.abc import Iterable, Iterator
lst = [x for x in range(10)]
gen = (x for x in range(10))
print(isinstance(lst, Iterable))
# True
print(isinstance(lst, Iterator))
# False
print(isinstance(gen, Iterable))
# True
print(isinstance(gen, Iterator))
# True