可迭代對象
能夠直接做用於for循環的數據類型有如下幾種
1) 集合數據類型,如list、tuple、dict、set、str等
2) 生成器,包括生成器和帶yield的生成器函數
這些可直接做用於for循環的對象統稱爲可迭代對象(Iterable)函數
判斷是不是可迭代對象
經過使用isinstance()判斷一個對象是不是Iterable對象spa
from collections import Iterable print(isinstance([], Iterable)) #輸出:True print(isinstance({}, Iterable)) #輸出:True print(isinstance('abc', Iterable)) #輸出:True print(isinstance((x for x in range(10)), Iterable)) #輸出:True print(isinstance(100, Iterable)) #輸出:False
迭代器
不但可做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值
能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator
判斷是不是Iterator對象
經過使用isinstance()判斷一個對象是不是Iterator對象code
from collections import Iterator print(isinstance((x for x in range(10)), Iterator)) #輸出:True print(isinstance([], Iterator)) #輸出:False print(isinstance({}, Iterator)) #輸出:False print(isinstance('abc', Iterator)) #輸出:False
迭代器和可迭代對象
可迭代對象:能夠做用於for循環,但不均可以使用next()獲取下一個值
可迭代對象中的集合數據類型是不能夠用next()的,但可迭代對象中的生成器倒是能夠使用next()的,因此可迭代對象不都是迭代器
迭代器:能夠做用於for循環,並能夠使用next()獲取下一個值對象
集合數據類型,可迭代對象,迭代器
集合數據類型中的list、dict、str雖然可迭代,但不是迭代器
由於Python的Iterator對象表示的是一個數據流,可把這個數據流看作一個有序序列
因爲不能提早知道序列的長度,只能不斷經過next()函數實現按需計算下一個數據,直到沒有數據時拋出StopIteration錯誤
因此Iterator的計算是惰性的,只有在須要返回下一個數據時它纔會計算
Iterator甚至能夠表示一個無限大的數據流,例如全體天然數,而使用list是永遠不可能存儲全體天然數的
將集合數據類型變成迭代器
把list、dict、str等Iterable變成Iterator能夠使用iter()函數blog
print(isinstance(iter([]), Iterator)) #輸出:True print(isinstance(iter('abc'), Iterator)) #輸出:True
小結
凡是可做用於for循環的對象都是Iterable類型
凡是可做用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列
集合數據類型如list、dict、str等是Iterable但不是Iterator,不過能夠經過iter()函數得到一個Iterator對象it
關於for循環
Python的for循環本質上就是經過不斷調用next()函數實現的io
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