迭代器
1. 可迭代对象
可以被迭代的对象称为可迭代对象(Iterable``)。简单讲凡是可用作for循环的对象,如集合(list / tuple / set / dict / str)和生成器(generator`)对象都是可迭代对象。
可迭代类型都继承自Iterable类(位于collections模块),我们可以通过内建函数isinstance(obj,class)来判断一个对象是否是可迭代对象。通过issubclass(cls,baseclass)来判断一个类型是否为可迭代类型。
py
from collections.abc import Iterable
# 可迭代对象判断
isinstance([], Iterable) # True
isinstance((), Iterable) # True
isinstance('abc', Iterable) # True
isinstance((x for x in range(10)), Iterable) # True 生成器
# 可迭代类型判断
issubclass(set, Iterable) # True
issubclass(dict, Iterable) # True
issubclass(range,Iterable) # True2. 迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
迭代器都继承自Iterator类(位于collections模块),类似可迭代对象的判定方式,我们可以通过isinstance(obj,class)来判断一个对象是否是迭代器。通过issubclass(cls,baseclass)来判断一个类型是否为迭代器。
py
from collections.abc import Iterator
# 迭代器对象判断
isinstance([], Iterator) # False
isinstance((), Iterator) # False
isinstance('abc', Iterator) # False
isinstance((x for x in range(10)), Iterator) # True 生成器
# 迭代器类型判断
issubclass(set, Iterator) # False
issubclass(dict, Iterator) # False
issubclass(range,Iterator) # False迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。
我们发现list / tuple / set / dict / str都是可迭代对象(Iterable),但却不是迭代器(Iterator),生成器(generator)是迭代器(Iterator)。
迭代器转换
在确定一个对象是可迭代对象时,可以使用iter(iterable)函数将其转为迭代器对象。
py
isinstance(iter([]), Iterator) # True
isinstance(iter('abc'), Iterator) # True