python 函式高階 迭代器

2022-09-16 19:54:15 字數 2504 閱讀 6544

迭代:可以理解成迴圈,迭代一次,迴圈一次

根據所學知識我們知道,直接作用於for迴圈的資料型別有:

一是集合資料型別,如str , list, tuple, dict, set等

一類是generator,如,生成器和帶yield的generator function

這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable,(聽到可迭代物件可以理解為可用for迴圈的物件)

可以用isinstance() 判斷乙個物件是否為iterable物件:

from collections import iterable

iterable

# 執行結果

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 iterator

isinstance('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型別,它們表示乙個惰性計算的序列;

集合資料型別如listdictstr等是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...