可以直接作用於for
迴圈的資料型別有以下幾種:
一類是集合資料型別,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
迴圈的物件統稱為可迭代物件:iterable
。
可以使用isinstance()
判斷乙個物件是否是iterable
物件:
>>> from collections importiterable
>>>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錯誤表示無法繼續返回下乙個值了。
可以使用isinstance()判斷乙個物件是否是iterator物件:
>>> from collections importiterator
>>> isinstance((x for x in range(10)), iterator)
true
>>>isinstance(, iterator)
false
>>>isinstance({}, iterator)
false
>>> isinstance('
abc'
, iterator)
false
生成器都是iterator
物件,但list
、dict
、str
雖然是iterable
,卻不是iterator
。
把list
、dict
、str
等iterable
變成iterator
可以使用iter()
函式:
>>>isinstance(iter(), iterator)true
>>> isinstance(iter('
abc'
), iterator)
true
你可能會問,為什麼list
、dict
、str
等資料型別不是iterator
?
這是因為python的iterator
物件表示的是乙個資料流,iterator物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
小結凡是可作用於for
迴圈的物件都是iterable
型別;
凡是可作用於next()
函式的物件都是iterator
型別,它們表示乙個惰性計算的序列;
集合資料型別如list
、dict
、str
等是iterable
但不是iterator
,不過可以通過iter()
函式獲得乙個iterator
物件。
python3的for
迴圈本質上就是通過不斷呼叫next()
函式實現的,例如:
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
python高階學習chapter03(迭代相關)
重要概念!迭代器,可迭代物件,生成器,很容易繞暈了。凡是可以使用for進行迴圈的就是可迭代物件,其中可以通過next方法逐步輸出的就是迭代器,生成器的形成有兩種 一種是把列表生成式改成 一種是帶有yield語句的。具體的可以看 接下來進入主題 如何實現乙個迭代器?實現乙個迭代器 from colle...
python 函式高階 python 函式高階
形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...
Python高階專題 可迭代物件協議以及迭代器
1.迭代協議與可迭代物件 只有實現了迭代協議 iter 才可以稱為可迭代物件 2.迭代器 訪問集合內元素的方式,用於遍歷資料,但是無法返回,提供了惰性訪問資料,同時實現了 iter 以及 next 協議 from collections.abc import iterable,iterator it...