python叠代器
我們已經知道,可以直接作用於for
循環的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
循環的對象統稱為可叠代對象:Iterable
。
可以使用isinstance()
判斷一個對象是否是Iterable
對象:
from collections import Iterable print(isinstance([],Iterable)) #True print(isinstance({},Iterable)) #True print(isinstance(‘123‘,Iterable)) #True print(isinstance((x for x in range(10)),Iterable)) #True print(isinstance(123,Iterable)) #False
而生成器不但可以作用於for
循環,還可以被next()
函數不斷調用並返回下一個值,直到最後拋出StopIteration
錯誤表示無法繼續返回下一個值了。
可以被next()
函數調用並不斷返回下一個值的對象稱為叠代器:Iterator
。
判斷一個對象是否是Iterator
對象:
from collections import Iterator print(isinstance([],Iterator)) #False print(isinstance({},Iterator)) #False print(isinstance(‘123‘,Iterator)) #False print(isinstance((x for x in range(10)),Iterator)) #True print(isinstance(123,Iterator)) #False
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函數:
from collections import Iterator list1 = iter(range(10)) print(isinstance(list1,Iterator)) #True print(list1.__next__())#0 print(list1.__next__())#1 print(list1.__next__())#2
你可能會問,為什麽list
、dict
str
等數據類型不是Iterator
?
這是因為Python的Iterator
對象表示的是一個數據流,Iterator對象可以被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數實現按需計算下一個數據,所以Iterator
的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator
甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。
小結
凡是可作用於for
循環的對象都是Iterable
類型;
凡是可作用於next()
函數的對象都是Iterator
類型,它們表示一個惰性計算的序列;
集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函數獲得一個Iterator
對象。
參考文檔: 叠代器--廖老師博客
python叠代器