Python 迭代物件 迭代器 生成器

2022-05-27 06:39:16 字數 2574 閱讀 4114

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個的迭代獲取,可以用 in / not in 關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有元素儲存在記憶體中。比如:list, set, tuples都是容器物件

>>> 1 in [1, 2, 3]

true

>>> 4 not in [1,2,3]

true

>>> 1 in (1,2,3)

true

>>> 4 not in (1,2,3)

true

>>> 1 in

true

>>> 4 not in

true

什麼的迭代?

迭代就是可以被 for 迴圈遍歷, 在python中一切皆物件,可以被 for 迴圈迭代的物件就叫 可迭代物件;

>>> for i in [1,2,3]:

... print(i)

...123

>>> for i in (1,2,3):

... print(i)

...123

>>> for i in :

... print(i)

...a

cb

可迭代物件並不是指某種具體的資料型別,list 是可迭代物件,dict是可迭代物件,set也是可迭代物件。

可迭代物件是實現了 __iter__() 方法的物件,而迭代器(iterator)則是實現了 __iter__() 和 __next()__ 方法的物件,可以顯示的獲取下乙個元素,這種可以被 next 呼叫並不斷返回下乙個值的物件稱為迭代器;

iterator是乙個帶狀態的物件,能在呼叫next()方法的時候返回容器中的下乙個值,任何實現了__iter__和__next__()方法的物件都是迭代器

__iter__返回迭代器自身,__next__返回容器中的下乙個值,如果容器中沒有更多的元素了,則丟擲stopiteration異常。所以迭代器是每次詢問要下乙個值的時候返回

迭代器一定是可迭代物件,反過來則不一定成立。

>>> l1 = ['a', 'b', 'c']

>>> l_iter = l1.__iter__()

# 可迭代物件通過呼叫 __iter__方法生成乙個迭代器

>>> l_iter

# 迭代器通過 __next__方法返回乙個值

>>> l_iter.__next__()

'a'>>> l_iter.__next__()

'b'>>> l_iter.__next__()

'c'>>> l_iter.__next__()

traceback (most recent call last):

file "", line 1, in stopiteration

迭代器是乙個惰性的計算,等到有人呼叫的時候才返回值,沒呼叫的時候就處於休眠狀態等待下一次呼叫。

generator 是一種資料型別,這種資料型別自動實現了迭代器協議,所以生成器就是可迭代物件;

生成器一定是迭代器,反之則不成立。

當在記憶體中儲存乙個很大的列表時,需要消耗大量的記憶體,如果列表元素可以按照某種演算法推算出來,那我們就可以通過迴圈的過程不斷推算出後續的元素,這樣就不必建立完成的list, 從而節約了大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器(generator)

建立乙個生成器有兩種方式:

(1)把乙個列表生成式的改成()

>>> l1 = ['a', 'b', 'c']

>>> l = [x for x in range(10)]

>>> l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> g = (x for x in range(10))

>>> g

at 0x000001ea16972308>

(2)通過yield 關鍵字

def fib(max):

n, a, b = 0, 0, 1

while n < max:

yield b

a, b = b, a + b

n += 1

f = fib(5)

print(list(f))

# 執行結果:

# [1, 1, 2, 3, 5]

fib就是乙個普通的python函式,特殊的地方在於函式體中沒有 return關鍵字,函式的返回值是乙個生成器物件。此時函式體中的**並不會執行,儲存的是乙個演算法。

可以通過遍歷迭代器的方式來遍歷生成器。

(1)容器是一系列元素的集合:str, list, set, dict, file, sockets物件都可以看做容器,容器是可以被迭代的,因此他們稱為可迭代物件

(2)可迭代物件實現了__iter__方法,該方法返回乙個迭代器物件

(3)迭代器持有乙個內部狀態的字段,用於記錄下一次迭代返回值,它實現了__next__和__iter__方法,迭代器不會一次性把所有元素載入到記憶體,而是需要的時候返回結果。

(4)生成器是一種特殊的迭代器,它的返回值不是通過return而是通過yield.

python迭代物件 迭代器 生成器

對計算機特定程式中需要反覆執行的子程式 一組指令 進行一次重複,即重複執行程式中的迴圈,直到滿足某條件為止,亦稱為迭代。滿足迭代條件的叫做可迭代物件,比如for迴圈 lst 11 22,33 44 for i in lst print i 從lst中迴圈遍歷輸出值,這個過程是重複執行,叫做迭代,這個...

Python 可迭代物件 迭代器 生成器

在討論可迭代物件和迭代器之前,我們先來了解一下什麼是迭代器 迭代器是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每乙個元素而不用了解底層的實現。維基百科 迭代是資料處理的基石。當記憶體中放不下資料集時,我們要找到一種惰性獲取資料的方式,即按需一次獲取乙個資料項,這就是迭代器...

python可迭代物件 迭代器 生成器

乙個擁有 iter 方法的物件,可以使用for迴圈遍歷 可迭代物件有 str list tuple dict set iterator generator file 判斷乙個物件是否可迭代 from collections import iterable isinstance abc iterabl...