可以直接作用于for循环的数据类型有以下几种:
1、集合数据类型: list、tuple、dict、set、str等
2、generator,包括生成器和带yield的函数
这些可以直接作用域for循环的对象统称为可迭代的对象: Iterable
可以通过isinstance()来判断一个对象是否为Iterable对象:
from collections import Iterable print(isinstance([],Iterable)) print(isinstance('abc',Iterable)) print(isinstance((),Iterable)) print(isinstance({},Iterable)) print(isinstance((x for x in range(10)),Iterable)) print(isinstance(1000,Iterable))
执行结果:
True True True True True False
生成器不但可以作用于 for循环,而且可以通过next()函数不断调用并返回下一个值,直到抛出StopIteration错误,表示无法继续返回下一个值
可以被next()函数调用并不断返回下一个值的对象称为迭代器: Iterator
可以使用isinstance()判断一个对象是否为Iterator对象:
from collections import Iterator print(isinstance([],Iterator)) print(isinstance('abc',Iterator)) print(isinstance((),Iterator)) print(isinstance({},Iterator)) print(isinstance((x for x in range(10)),Iterator)) print(isinstance(100,Iterator))
执行结果:
False False False False True False
可以看出,虽然list、dict、str是Iterable,却不是Iterator
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到StopIteration错误被抛出。可以把这个数据流堪称是一个有序序列,但是,却无法提前预知该序列的长度,只能通过不断调用next()函数去获取下一个数据。
所以,Iterator的计算是惰性的(惰性计算),只要在需要的时候,才会去计算并返回下一个值。
我们可以通过iter()函数将上面的Iterable转换为Iterator
print(isinstance(iter([]),Iterator)) print(isinstance(iter('abc'),Iterator)) print(isinstance(iter(()),Iterator)) print(isinstance(iter({}),Iterator))
执行结果:
True True True True