Python之迭代器

2021-08-21 04:22:55 字數 2470 閱讀 2858

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別,如listtupledictsetstr等;

一類是generator,包括生成器和帶yield的generator function。

這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable

可以使用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錯誤表示無法繼續返回下乙個值了。

可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator

可以使用isinstance()判斷乙個物件是否是iterator物件:

>>> 

from collections import iterator

>>> isinstance((x for x in range(10)), iterator)

true

>>> isinstance(, iterator)

false

>>> isinstance({}, iterator)

false

>>> isinstance('abc', iterator)

false

生成器都是iterator物件,但listdictstr雖然是iterable,卻不是iterator

listdictstriterable變成iterator可以使用iter()函式:

>>> isinstance(iter(), iterator)

true

>>> isinstance(iter('abc'), iterator)

true

你可能會問,為什麼listdictstr等資料型別不是iterator

這是因為python的iterator物件表示的是乙個資料流,iterator物件可以被next()函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。

iterator甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;

集合資料型別如listdictstr等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:

python之迭代器

可迭代物件就是序列觀念的通用化,如果物件是實際儲存的序列,或者可以在迭代工具環境 eg for迴圈 中一次產生乙個結果的物件,就可看成是可迭代的。可迭代物件包括實際序列和按照需求而計算的虛擬序列。常見的迭代工具 for迴圈 列表解析 in成員關係測試以及map內建函式等。1.檔案迭代器 readli...

python之迭代器

首先需要搞清楚兩個概念 可迭代,迭代器,兩者不能混為一談。可以直接作用於for迴圈的物件統稱為可迭代物件 iterable python裡可以用isinstance iterable 來檢測第乙個引數是不是可迭代的 這裡第乙個引數是乙個列表 注意,可迭代和 迭代器 是不一樣的!可以被next 函式呼...

Python之迭代器

檔案迭代器 方法 next 手動迭代 內建函式iter和next 其他型別迭代器 自定義迭代器 具體用途 乙個實現了 iter 方法和 next 方法的物件,就是迭代器 內建函式next會自動呼叫乙個物件的 next 方法。給定乙個可迭代物件x,呼叫next x 等同於x.next 該迭代器根據需要...