Python3入門之 迭代子

2021-10-24 07:22:38 字數 2047 閱讀 1262

iterable資料型別每次返回其中的乙個資料項。

任意包含__iter__()方法的物件或任意序列(也即包含__getitem__()方法的物件,該方法接受從0開始的整數引數)都是乙個iterable,並可以提供乙個迭代子。迭代子是乙個物件,該物件可以提供__next__()方法,該方法依次返回每個相繼的資料項,並在沒有資料項時產生stopiteration異常。

資料項返回的順序依賴於底層的iterable。對列表與元組等情況,資料項的返回通常從第乙個資料項(索引位置0)開始依序返回,但是有些迭代子也可能以任意順序返回資料項——比如,用於字典與集合的迭代子。

內建的iter函式有兩種很不同的行為。給定乙個組合資料型別或序列時,該函式將返回乙個用於傳遞給函式的物件的迭代子——如果該物件無法進行迭代,就產生乙個typeerror異常。在建立自定義組合資料型別時,會有這種用法,但在其他上下文中極少使用。第二種不同的iter()行為是在為該函式傳入乙個可呼叫的(函式或方法)引數與乙個哨點值。在這種情況下,傳入的函式在每次迭代時都會進行呼叫,並每次返回該函式的返回值,如果返回值等於哨點值,就產生stopiteration異常。

使用for item in iterable迴圈時,python在效果上是呼叫iter(iterable)來獲取乙個迭代子。之後再每次迴圈迭代時,將呼叫該迭代子的__next__()方法以獲取下乙個資料項,在產生stopiteration異常時,將捕獲這個異常,迴圈終止。獲取迭代子的下一項的方法是呼叫內建的next函式。

product =

1for i in[1

,2,4

,8]:

product *= i

print

(product)

# prints:64

#相當於

product =

1i =

iter([

1,2,

4,8]

)while

true

:try

: product *=

next

(i)except stopiteration:

break

print

(product)

# prints:64

通過呼叫tuple(i),任意(有窮的)iterable,i,都可以轉換為乙個元祖,或通過呼叫list(i)轉換為乙個列表。enumerate函式以迭代子偉引數,並返回乙個列舉物件,該物件可以看成迭代子,每次迭代時,將返回乙個二元組,該二元組的第一項為迭代次數(預設從0開始),第二項是來自enumerate()呼叫時的迭代子的下一項。

open函式以文字模式開啟時返回的檔案物件可用作迭代子,每次迭代時返回該檔案的一行。通過將迭代子傳遞給enumerate(),可以獲取乙個列舉迭代子,該迭代子在每次迭代時,將返回迭代次數(存放於變數line,「行號」中)以及該檔案的一行。enumerate函式接受乙個可選的關鍵字引數,start,預設為0,使用時這一引數設定為1,因為按照常規,文字檔案行號是從1開始計數的。

sorted()函式返回乙個列表,列表中的資料項都進行了排序,reversed()函式簡單地返回乙個迭代子,該迭代子在進行迭代時採用的順序與作為引數賦予該迭代子的值順序想法。

python3 迭代器 python3 迭代器

auther aaron fan 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinsta...

python3菜鳥 Python3 迭代器與生成器

如教程所說,迭代器和生成器算是 python 一大特色,其核心是基於迭代器協議來的。而平時我們經常使用的 for in 迴圈體,本質就是迭代器協議的一大應用。同時 python 內建的集合型別 字元 列表 元組 字典 都已經實現了迭代器協議,所以才能使用 for in 語句進行迭代遍歷。for in...

python3入門之堆(heapq)

堆是乙個二叉樹,其中每個父節點的值都小於或等於其所有子節點的值。整個堆的最小元素總是位於二叉樹的根節點。python的heapq模組提供了對堆的支援。堆資料結構最重要的特徵是heap 0 永遠是最小的元素 注 heap為定義堆,item增加的元素 heapq.heapify list 注 將列表轉換...