咱們已經知道,能夠直接做用於for
循環的數據類型有如下幾種:python
一、類是集合數據類型,如list
、tuple
、dict
、set
、str
等;編程
二、一類是generator
,包括生成器和帶yield
的generator function。函數
這些能夠直接做用於for
循環的對象統稱爲可迭代對象:Iterable,可迭代的意思就是可遍歷、可循環。code
可使用isinstance()
判斷一個對象是不是Iterable
對象:對象
>>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
而生成器不但能夠做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值了。generator
能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。it
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。io
把list
、dict
、str
等Iterable
變成Iterator
可使用iter()
函數:for循環
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
你可能會問,爲何list
、dict
、str
等數據類型不是Iterator
?function
這是由於Python的Iterator
對象表示的是一個數據流,Iterator對象能夠被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。能夠把這個數據流看作是一個有序序列,但咱們卻不能提早知道序列的長度,只能不斷經過next()
函數實現按需計算下一個數據,因此Iterator
的計算是惰性的,只有在須要返回下一個數據時它纔會計算。
Iterator
甚至能夠表示一個無限大的數據流,例如全體天然數。而使用list是永遠不可能存儲全體天然數的。
總結
凡是可做用於for
循環的對象都是Iterable
類型;
凡是可做用於next()
函數的對象都是Iterator
類型,它們表示一個惰性計算的序列;
集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過能夠經過iter()
函數得到一個Iterator
對象。