迭代:可以理解成迴圈,迭代一次,迴圈一次
根據所學知識我們知道,直接作用於for迴圈的資料型別有:
一是集合資料型別,如str , list, tuple, dict, set等
一類是generator,如,生成器和帶yield的generator function
這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable,(聽到可迭代物件可以理解為可用for迴圈的物件)
可以用isinstance() 判斷乙個物件是否為iterable物件:
from collections import iterableiterable
# 執行結果
isinstance('abv', iterable)
true # 執行結果
isinstance(1233, iterable)
false # 執行結果
isinstance((i for i in range(10)), iterable)
true # 執行結果
而生成器不但可以作用於fou迴圈,還可以被next()不斷呼叫並返回下乙個值,知道最後丟擲stopiteration錯誤表示無法繼續。
所以生成器只是迭代器的一種,而且不只是生成器可以被next()呼叫,自己寫的乙個不是生成器的東西也可以被next()呼叫。
可以用isinstance() 判斷乙個物件是否為iterabor物件:
from collections import iteratorisinstance('abv', iterator)
false # 執行結果
isinstance(1233, iterator)
false # 執行結果
isinstance(, iterator)
false # 執行結果
isinstance({}, iterator)
false # 執行結果
isinstance((i for i in range(10)), iterator)
true # 執行結果
生成器都是iterabor物件,而list, str, dict 都只是iterable,而不是 iterator,把list, str, dict等iterable變成iterator,可以使用iter()函式:
isinstance(iter(), iterator)true # 執行結果
isinstance(iter({}), iterator)
true # 執行結果
為什麼list,dict,str 等不是iterator,
因為再pyton中,iterator物件表示的是乙個資料流(沒有辦法判斷終點在**,無窮盡的,就是說產生這個資料的時候不知道什麼時候結束,比如說時間就是乙個時間流,而乙個列表,字串都是由一定長度的,字典是有一定大小的),形成乙個迭代器的時候,不需要管內容,他會一直往走,沒有終止條件。(也就是說如果乙個變數是乙個迭代器,len一下並不能算出他的長度)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迭代器及高階函式
collections.abc iterator的模組 iterator 迭代器 iterable 可迭代物件 functools 模組引入 reduce reduce 高階函式 做累計算 dir 獲取當前類的所有成員 closure 獲取閉包函式的使用變數 func cell contents 獲...
python迭代器高階
我們之前簡單的了解了一下迭代器,本篇,我們來看看迭代器具體的使用方法吧!lst 1 2,3 4 import dis 引入標準庫dis,用它觀察for迴圈的細節。dis.dis for i in lst pass 1 0 setup loop 12 to 14 2 load name 0 lst 4...
2 3 15 Python 函式高階 迭代器
可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable。可以使用isinsta...