之前学过的list,tuple,dice,set,str,generator(包括生成器和带yield的generator函数)等都是可被for循环迭代的对象,都统称为可迭代对象:Iterable
可使用isinstance()判断一个对象是否为Iterable对象
如:
from collections import Iterable isinstance([],iterable) ==>True isinstance(‘abc‘,iterable) ==>True
等其他的实例,如字典,集合等
数字是不是可迭代对象
isinstance(100,iterable) ==结果===False====
可以被next()函数调用并不断返回下一个值的对象称之为迭代器:Iterator
from collections import iterator isinstance((x for x in range(10)),Iterator) ==>True isinstance([],Iterator) ==>False
生成器一定是迭代器,迭代器不一定是生成器。。
迭代对象(Iterable)对象转换成迭代器(Iterator)可使用iter()函数
isinstance(iter(‘abc‘),Iterator) ==>True isinstance(iter([],Iterator) ==> True
a = [1,2,3]
iter(a)
print(a)
===结果===<gen......
在python中迭代器(Iterator)表示的是一个数据流,迭代器对象可以被next()函数调用并返回下一个数据,直到没有数据时抛出stopIteration错误。可以把这个数据流看做是一个有序序列,但不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以迭代器对象计算是具有惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,如全体自然数,而使用list是永远不可能存储全体自然数的。
小结:
凡是可使用于ofr的对象都是Iterable类型
凡是可用于next()函数的对象都是Iterator类型
集合数据类型如list、dict、str等都是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象
Python的for循环本质上就是通过不断调用next()函数实现的,如:
for x in range(5)
pass
实际上完全等价于
it = tier([0,1,2,3,4])
while True:
try:
x = next(i)
except stopIteration:
break