迭代器和可迭代

2022-06-15 14:48:12 字數 2884 閱讀 5835

所有的迭代器都是可迭代的

迭代器模式

實現乙個自定義的迭代器模式需要兩個類,分別為實現了__iter__方法的類和通過__iter__返回的迭代器例項類(實現了__iter__和__next__方法)。下面例子簡單實現了上述功能。12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

27classitertext:

def__init__(self, text):

self.text=text

def__iter__(self):

returniteratortext(self.text)

classiteratortext:

def__init__(self, text):

self.text=text

self.index=0

def__iter__(self):

returnself

def__next__(self):

try:

letter=self.text[self.index]

exceptindexerror:

raisestopiteration

self.index+=1

returnletter

text=itertext("hey")

forlintext:

print(l)

可迭代的itertext實現了__iter__方法,返回了迭代器iteratortext例項。iteratortext實現了__next__方法返回下乙個迭代元素直到丟擲異常,同時iteratortext實現了__iter__方法返回自身物件用於迭代。

這裡的itertext和iteratortext很容易混淆,如果在itertext中實現了__next__方法並將__iter__中返回自身例項self也可以實現上述功能,但通常可迭代物件和迭代器應當分開,這樣在可迭代物件中的__iter__中可以返回不同的迭代器物件,使功能獨立。

生成器(generator)

通過上述文章說明,迭代器通過next()不斷產出下乙個元素直到迭代器耗盡,而python中的生成器可以理解為乙個更優雅的迭代器(不需要實現__iter__和__next__方法),實現了迭代器協議,它也可以通過next()產出元素。

python中的生成器主要分為兩種型別:

生成器函式(generator function)返回得到的生成器:

包含yield關鍵字的函式稱為生成器函式

python標準庫中存在著一些可迭代物件,例如:list, tuple, dict, set, str等。

編譯器若想迭代乙個物件a,則會自動呼叫iter(a)獲取該物件的迭代器(iterator),如果iter(a)丟擲異常,則物件a不可迭代。

判斷物件是否可迭代

原生函式iter(instance) 可以判斷某個物件是否可迭代,它的工作流程大概分為以下3個步驟:

區別:生成器能做到迭代器能做的所有事,而且因為自動建立了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表示式取代列表解析可以同時節省記憶體。除了建立和儲存程式狀態的自動方法,當發生器終結時,還會自動丟擲stopiteration異常

迭代器和可迭代物件

本篇文章簡單談談可迭代物件,迭代器和生成器之間的關係。三者簡要關係圖 可迭代物件與迭代器 剛開始我認為這兩者是等同的,但後來發現並不是這樣 下面直接丟擲結論 1 可迭代物件包含迭代器。2 如果乙個物件擁有 iter 方法,其是可迭代物件 如果乙個物件擁有next方法,其是迭代器。3 定義可迭代物件,...

可迭代物件和迭代器

建立這個物件的類中是否定義了 iter 方法,如果定義了,那麼這個物件就是可迭代物件。isinstance obj,iterable 判斷 判斷乙個物件是不是迭代器的時候,需要判斷建立這個例項物件的類中是否定義了 iter 方法和 next 方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙...

可迭代物件和迭代器

實現了 iter 方法的物件稱為可迭代物件,在python中,可迭代物件有字串 列表 元組 字典 集合等 class mynumbers def init self self.a 1 def iter self return self my numbers mynumbers 判斷物件是否是可迭代物...