python入門之叠代器
阿新 • • 發佈:2018-12-26
循環 生成器 作用 ner als exce 實現 ont instance
叠代器
已知,可以直接作用於for循環的數據類型有:
一類是集合數據類型,如list、tuple、dict、set、str
一類是generator,包括生成器和帶yield的generator function
這些可以直接作用於for循環的對象統稱為可叠代對象:Iterable
判斷是否為可叠代對象:
>>> from collections import Iterable >>> isinstance([],Iterable) True >>> isinstance({},Iterable) True >>> isinstance(‘abc‘,Iterable) True >>> isinstance(x*2 for x in range(10),Iterable) True >>> isinstance(100,Iterable) False
可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator
判斷是否為叠代器:
>>> from collections import Iterator >>> isinstance([],Iterator) False >>> isinstance({},Iterator) False>>> isinstance(‘abc‘,Iterator) False >>> isinstance((x*2 for x in range(10)),Iterator) True >>> isinstance(100,Iterator) False
使用iter()函數可將list、dict、str等Iterable變成Iterator
為什麽list、dict、str等數據類型不是Iterator?
因為python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤,可以把這個數據流看作是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator可以表示一個無限大的數據流,例如全體自然數,而使用list是永遠不可能存儲全體自然數的。
另外:
python的for循環本質上就是通過不斷調用next()函數實現的,例如:
for x in [1,2,3,4,5]:
pass
實際上完全等價於:
#首先獲得Iterator對象: it = iter([1,2,3,4,5]) #循環: while True: try: #獲得下一個值 x = next(it) except stopIteration: #遇到stopiteration就退出循環 break
python入門之叠代器