我們已經知道,可以直接作用於for
迴圈的資料型別有以下幾種:
一類是集合資料型別,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
迴圈的物件統稱為可迭代物件:iterable
。
可以使用isinstance()
判斷乙個物件是否是iterable
物件:
>>> from collections.abc 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
錯誤表示無法繼續返回下乙個值了。
可以使用isinstance()
判斷乙個物件是否是iterator
物件:
>>> from collections.abc import iterator
>>> 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
物件。
python的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就退出迴圈
Python學習 迭代器
含義迭代的意思類似於迴圈,每一次重複的過程被稱為一次迭代的過程,而每一次迭代得到的結果會被用來作為下一次迭代的初始值 提供迭代方法的容器稱為迭代器,常用的迭代器 列表 元組 字串 字典。示例 1 字串 字串就是乙個容器,同時也是乙個迭代器,for 語句的作用就是觸發這個迭代器的迭代功能,每次從容器裡...
python 迭代器 python迭代器
迭代器 可以直接作用for迴圈的資料型別 我們已經知道,可以直接作用for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 可迭代物件定義 這些可以直接作用fo...
python學習 Python的迭代器
1 什麼是迭代器 迭代器就是提供 next 方法的物件 2 如何使用迭代器 for v in it python 的 for 語句可對迭代器進行處理,它自動呼叫迭代器的 next 方法進行遍歷,並在遇到 stopiteration 異常後終止迴圈 3 有哪些迭代器?list,dict,檔案物件,都屬...