Python中的可迭代物件 迭代器和生成器

2021-09-11 21:28:15 字數 3004 閱讀 2920

可迭代物件

簡單來講,乙個實際儲存的序列,或者可以通過類似for i in [1, 2, 3, 4, 5]:類似的語法取值的物件,列表就是乙個典型的可迭代物件:

>>> my_list = [1, 2, 3, 4, 5]

>>>

for i in my_list:

... print(i)

... 12

345複製**

for語句在此處提供了乙個迭代環境,for語句通過跌打協議從可迭代物件中取出值。for迴圈執行時,實際上是獲取了可迭代物件的迭代器,呼叫了迭代器的__next__函式,來生成序列的下乙個值。當序列結束時,呼叫__next__函式會丟擲stopiteration異常,for迴圈語句可以捕獲這個異常,以決定何時終止迴圈。

注意,可迭代物件是不可以直接呼叫__next__()方法的。

>>> my_list.__next__()

traceback (most recent call last):

file "", line 1, in

attributeerror: 'list' object has no attribute '__next__'

複製**

迭代器

通常,我們可以通過iter()方法獲取可迭代物件中的迭代器,迭代器可以直接呼叫__next__()方法:

>>> li = iter(my_list)

>>> li.__next__()

1>>> iter_list = iter(my_list)

>>> iter_list.__next__()

1>>> iter_list.__next__()

2>>> iter_list.__next__()

3>>> iter_list.__next__()

4>>> iter_list.__next__()

5>>> iter_list.__next__()

traceback (most recent call last):

file "", line 1, in

stopiteration

複製**

當迭代器結束時,呼叫__next__()方法會丟擲stopiteration異常。 在pyhon3中,還提供了乙個內建函式next(),可以自動呼叫乙個物件的__next__()方法。

>>> iter_list = iter(my_list)

>>> next(iter_list)

1>>> next(iter_list)

2>>> next(iter_list)

3>>> next(iter_list)

4>>> next(iter_list)

5>>> next(iter_list)

traceback (most recent call last):

file "", line 1, in

stopiteration

複製**

同樣地,內建next()方法也不可以直接用於可迭代物件。

>>> next(my_list)

traceback (most recent call last):

file "", line 1, in

typeerror: 'list' object is

not an iterator

複製**

報錯顯示list物件不是乙個迭代器。

生成器生成器提供了乙個在需要的時候才產生結果的工具,而不是立即產生結果,可以通過兩種方式來建立

def

squares

(n):

for i in range(n):

yield = i ** 2

複製**

yield語句會掛起該函式,並向呼叫者傳送乙個值,並且儲存函式當前的執行狀態,類似於上下文,使得函式能夠在離開的地方繼續執行。 當函式包括一條yield語句時, 會自動編譯稱為生成器,當呼叫時,會返回乙個生成器物件,該物件支援使用__next__()方法來自動執行介面,並且在結束時丟擲stopiteration異常

>>> [x ** 2

for x in range(4)]

[0, 1, 4, 9]

複製**

上面的語句是乙個列表解析表示式,返回乙個列表。

>>> (x ** 2

for x in range(4))

at 0x1030cfe60>

複製**

將中括號改為小括號,這條語句就變成了乙個生成器表示式,如果想儲存並且使用該表示式,需要使用乙個變數接收。

>>> x = (x ** 2

for x in range(4))

>>> x.__next__()

0>>> next(x)

1>>> x.__next__()

4>>> next(x)

9>>> x.__next__()

traceback (most recent call last):

file "", line 1, in

stopiteration

複製**

python中 可迭代物件

迭代是訪問集合元素的 種 式。迭代器是 個可以記住遍歷的位置的物件。迭代器物件從集合的第 個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。我們已經知道可以對list tuple str等型別的資料使 for in 的迴圈語法從 其中依次拿到資料進 使 我們把這樣的過程稱為遍歷,也...

PYTHON 迭代器 可迭代物件

通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...

python迭代 可迭代物件與迭代器物件

問題舉例 某軟體要求,從網路抓取各個城市的氣溫資訊,並依次顯示 北京 15 22 上海 18 23 如果一次抓取所有城市氣溫資訊再顯示,顯示第乙個城市的氣溫時會由很長的延時,並且浪費儲存空間,我們期望以 用時訪問 的策略,並且把所有城市的氣溫資訊封裝 到乙個物件裡,可用for語句進行迭代。來個栗子 ...