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

2021-10-05 23:20:58 字數 1837 閱讀 9860

在討論可迭代物件和迭代器之前,我們先來了解一下什麼是迭代器:

迭代器是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每乙個元素而不用了解底層的實現。

——《維基百科》

迭代是資料處理的基石。當記憶體中放不下資料集時,我們要找到一種惰性獲取資料的方式,即按需一次獲取乙個資料項,這就是迭代器模式。 

可迭代物件,從名稱上就可以理解,它是乙個可以迭代的物件。我們知道,python中的列表、元組、甚至字串都是可以迭代的,我們通過for迴圈來進行迭代。那迭代是如何進行的呢?什麼是可迭代的,什麼又是不可迭代的呢?

當我們迭代乙個物件時,直譯器會對物件呼叫內建的iter()函式來獲取乙個迭代器,iter()函式有以下作用:

所以當乙個物件中沒有__iter__方法時,物件是不可迭代的(not iterable)

如果乙個物件定義了__iter__方法,則它是可迭代的(iterable)

但是需要注意:__iter__方法需要返回乙個迭代器(iterator),不然不能正常的迭代

簡單理解迭代器和可迭代物件的關係,就是:迭代器是乙個可迭代物件,可迭代物件不一定是迭代器,但需要包含迭代器

我們可以自己實現乙個迭代器和可迭代物件來感受一下它們的關係:

迭代器

實現__next__方法,用以返回物件中的下乙個元素;

實現__iter__方法,返回本身(self),使自己能被迭代。

可迭代物件

實現__iter__方法(或者__getitem__方法),但需要返回乙個迭代器,使物件可以被迭代;

在python中建立迭代器最方便的方法是使用生成器。生成器也是迭代器。生成器的語法類似於函式,但是不返回值。為了顯示序列中的每乙個元素,會使用yield語句。只要python函式的定義體中有yield關鍵字,該函式就是生成器函式。呼叫生成器函式時,會返回乙個生成器物件。

獲取生成器通常有兩種方式,生成器函式和生成器表示式。

def test():                  # 生成器函式

for i in range(10):

yield i

r = (i for i in range(10)) # 生成器表示式

t = test()

print(t) # print(r) # at 0x0000015bb318c548>

print('__next__' in dir(t)) # true

print('__next__' in dir(r)) # true

由以上可以看出,生成器也是一種迭代器。

PYTHON 迭代器 可迭代物件

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

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

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

迭代器 可迭代物件 迭代器物件

今天的學習內容有 迭代器 可迭代物件 迭代器物件 for迴圈內部原理 生成器和生成器表示式 面向過程程式設計 迭代就是指更新換代的過程,要重複進行,而且每次的迭代都必須基於上一次的結果。我們使用for迴圈的時候就是把元素從容器裡乙個個取出來,這種過程其實就是迭代。迭代器 迭代取值的工具。迭代器的作用...