之前學過的list,tuple,dice,set,str,generator(包括生成器和帶yield的generator函數)等都是可被for循環迭代的對象,都統稱爲可迭代對象:Iterable
可使用isinstance()判斷一個對象是否爲Iterable對象
如:
from collections import Iterable isinstance([],iterable) ==>True isinstance('abc',iterable) ==>True
等其他的實例,如字典,集合等
數字是不是可迭代對象
isinstance(100,iterable) ==結果===False====
可以被next()函數調用並不斷返回下一個值的對象稱之爲迭代器:Iterator
from collections import iterator isinstance((x for x in range(10)),Iterator) ==>True isinstance([],Iterator) ==>False
生成器一定是迭代器,迭代器不一定是生成器。。
迭代對象(Iterable)對象轉換成迭代器(Iterator)可使用iter()函數
isinstance(iter('abc'),Iterator) ==>True isinstance(iter([],Iterator) ==> True
a = [1,2,3]
iter(a)
print(a)
===結果===<gen......
在python中迭代器(Iterator)表示的是一個數據流,迭代器對象可以被next()函數調用並返回下一個數據,直到沒有數據時拋出stopIteration錯誤。可以把這個數據流看做是一個有序序列,但不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以迭代器對象計算是具有惰性的,只有在需要返回下一個數據時它纔會計算。
Iterator甚至可以表示一個無限大的數據流,如全體自然數,而使用list是永遠不可能存儲全體自然數的。
小結:
凡是可使用於ofr的對象都是Iterable類型
凡是可用於next()函數的對象都是Iterator類型
集合數據類型如list、dict、str等都是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象
Python的for循環本質上就是通過不斷調用next()函數實現的,如:
for x in range(5)
pass
實際上完全等價於
it = tier([0,1,2,3,4])
while True:
try:
x = next(i)
except stopIteration:
break