我們前面說過Iterable郎仆,所有的集合數(shù)據(jù)類型(比如list,tuple瞎嬉,dict蝎毡,set,str等)都是Iterable對象氧枣,包括上一篇說到的generator沐兵,也是Iterable。他們有一個共同的特點挑胸,那就是都可以用for循環(huán)進行迭代痒筒。你可以使用isinstance()函數(shù)判斷一個對象是不是Iterable對象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({},Iterable)
True
而我們這一篇要講的迭代器(Iterator),不但可以跟Iterable對象一樣可以使用for循環(huán)迭代,還可以不斷調(diào)用next()函數(shù)返回下一個值茬贵。我們上一篇說的generator就是迭代器(Iterator)簿透。而list,tuple解藻,dict老充,set都不能通過不斷調(diào)用next()返回下一個值,所以它們不是Iterator螟左。
生成器不僅是Iterable對象啡浊,還是Iterator對象。
你可以使用isinstance()來判斷一個對象是不是Iterator對象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10), Iterator )
True
>>> isinstance([],Iterator)
False
雖然list胶背,dict巷嚣,tuple等Iterable對象不是Iterator,但你可以通過iter()函數(shù)把它們變成Iterator對象:
>>> isinstance(iter([]),Iterator)
True
Iterator對象是一個惰性序列钳吟。惰性序列是指它并沒有一下子就把它所有的元素列出來廷粒,因此它不知道自己有多少元素,只有當它不斷next()的時候红且,它才會去計算下一個值是多少——所以它比較懶惰坝茎。
Iterator的好處是它不用一下子就列出所有的元素,那樣會占用內(nèi)存空間暇番,所以它可以表示無限的概念嗤放。一個Iterator對象可以表示所有的自然數(shù),但是用一個list就辦不到壁酬,因為內(nèi)存有限次酌。