6.5 迭代器
我們已經(jīng)知道,可以直接作用于for
循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用于for
循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable
。
可以使用isinstance()
判斷一個對象是否是Iterable
對象:
而生成器不但可以作用于for
循環(huán),還可以被next()
函數(shù)不斷調(diào)用并返回下一個值,直到最后拋出StopIteration
錯誤表示無法繼續(xù)返回下一個值了。
可以被next()
函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator
。
可以使用isinstance()
判斷一個對象是否是Iterator
對象:
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函數(shù):
你可能會問,為什么list
、dict
、str
等數(shù)據(jù)類型不是Iterator
?
這是因為Python的Iterator
對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()
函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時拋出StopIteration
錯誤??梢园堰@個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator
的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。
Iterator
甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲全體自然數(shù)的。
小結(jié)
凡是可作用于for
循環(huán)的對象都是Iterable
類型;
凡是可作用于next()
函數(shù)的對象都是Iterator
類型,它們表示一個惰性計算的序列;
集合數(shù)據(jù)類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函數(shù)獲得一個Iterator
對象。
Python的for
循環(huán)本質(zhì)上就是通過不斷調(diào)用next()
函數(shù)實現(xiàn)的,例如: