可迭代对象(Iterable):可直接作用于for循环的对象。有:list,tuple,dict,set,str,generator。
迭代器(Iterator):可被__next()__函数调用并不断返回下一个值的对象。是一个数据结构。
判断某个对象是否是Iterable or Iterator用内置函数isinstance().如下例
from collections import Iterable,Iterator print(isinstance({},Iterable)) print(isinstance([],Iterable)) print(isinstance((2,3,4,5),Iterator))
一个Iterable对象可能不是Iterator,但可以用iter()将其转为Iterator.
b=iter([]) print(b) c=iter({}) print(c) d=iter({1,3,5,7,8}) print(d) e=iter("aaaaa") print(e)
那么为何list,dict,str,set不是Iterator?
最简单的理由:它们没有__next__()功能。 Python的Iterator对象表示一个数据流,可被next()函数调用并不断返回下一个数据,直到没有数据时会报出StopIteration错误。Iteration这个数据流可看成一个未知长度的有序序列,只能调用next()函数按需计算下一个值,因此Iterator是一个惰性计算。只有在需要返回下一个数据时它才会计算。Iterator可表示一个无限大的数据流。
for循环本质是一个迭代器。
为什么要用迭代器呢?见后续更新