一、可迭代物件
在python中,我們已經知道,可以直接作用於for
迴圈的資料型別有以下幾種:
一類是集合資料型別,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
迴圈的物件統稱為可迭代物件:iterable
。
可以使用isinstance()
判斷乙個物件是否是iterable
物件:
二、迭代器
可以被next()iterator
。
python的iterator
物件表示的是乙個資料流,iterator物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
生成器都是iterator
物件,但list
、dict
、str
雖然是iterable
,卻不是iterator
。
把list
、dict
、str
等iterable
變成iterator
可以使用iter()
函式:
三、生成器
在python中,使用生成器可以很方便的支援迭代器協議。生成器通過生成器函式產生,生成器函式可以通過常規的def語句來定義,但是不用return返回,而是用yield一次返回乙個結果,在每個結果之間掛起和繼續它們的狀態,來自動實現迭代協議。
也就是說,yield是乙個語法糖,內部實現支援了迭代器協議,同時yield內部是乙個狀態機,維護著掛起和繼續的狀態。
每次呼叫next(zrange)
,就計算出zrange的下乙個元素的值,直到計算到最後乙個元素,沒有更多的元素時,丟擲stopiteration
的錯誤。
小結:
當呼叫生成器函式的時候,函式只是返回了乙個生成器物件,並沒有執行。
Python基礎 迭代器和生成器
迭代器用於 直譯器需要迭代物件x時,會自動呼叫iter x 內建的iter函式,有以下功能 檢查物件是否實現了 iter 方法,如果實現了就呼叫它,獲取乙個迭代器。如果沒有實現 iter 方法,但是實現了 getitem 方法,python 會建立乙個迭代器,嘗試按順序 從索引 0 開始 獲取元素。...
Python基礎 迭代器和生成器
一 可迭代物件 在python中,我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭...
Python迭代器和生成器
先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...