所有的迭代器都是可迭代的
迭代器模式
實現乙個自定義的迭代器模式需要兩個類,分別為實現了__iter__方法的類和通過__iter__返回的迭代器例項類(實現了__iter__和__next__方法)。下面例子簡單實現了上述功能。12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
27class
itertext:
def
__init__(
self
, text):
self
.text
=
text
def
__iter__(
self
):
return
iteratortext(
self
.text)
class
iteratortext:
def
__init__(
self
, text):
self
.text
=
text
self
.index
=
0
def
__iter__(
self
):
return
self
def
__next__(
self
):
try
:
letter
=
self
.text[
self
.index]
except
indexerror:
raise
stopiteration
self
.index
+
=
1
return
letter
text
=
itertext(
"hey"
)
for
l
in
text:
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 判斷物件是否是可迭代物...