迭代器、生成器是python學習的重要概念,其在深度學習的資料集載入中應用也非常廣泛。本文主要闡述可迭代物件(iterable),迭代器(iterator)以及生成器(generator)的主要區別
首先,迭代器均為可迭代物件,生成器是特殊的迭代器,三者關係如下
1.可迭代物件(iterable)
乙個物件只要實現了__iter__()方法,那麼它就是可迭代物件,可迭代物件可以被for迴圈使用。
注意,並非所有被for 迴圈使用的都為可迭代物件,類中定義__getitem__(self, index),也可被for迴圈使用,但並非是可迭代物件
但自定義的可迭代物件要能在for迴圈中正確使用,就需要__iter__()實現必須是正確的。定義了__iter__()方法,可以使用iter()函式。
classfor i in a:iterobj:
def __init__(self):
self.a = [3, 5, 7, 11, 13, 17, 19
] self.n =len(self.a)
self.i = 0
a =iterobj()
iter(a)
>>>typeerror: '
iterobj
'object
is not iterable
print(a)
typeerror: 'iterobj' object is not iterable正確的__iter__()方法要返回乙個迭代器物件,即可以通過內建
iter()
函式轉成iterator
物件
class2.迭代器(iterator)乙個物件實現了__iter__()和__next__()方法,那麼它就是乙個迭代器物件。iterobj:
def __init__(self):
self.a = [3, 5, 7, 11, 13, 17, 19
] def __iter__(self):
return
iter(self.a) #返回列表a的迭代器
it =iterobj()
for i in
it: print(i)
>>>357
11...
classnext函式,呼叫__next__()方法iterobj:
def __init__(self, flag):
self.a = [3, 5, 7, 11, 13, 17, 19
] self.b = [2,3,4,5,6,7,8
] self.n =len(self.a)
self.i = 0
self.flag =flag
def __iter__(self):
ifself.flag:
return
iter(self.b) #返回列表b的迭代器
else
:
return
self #返回自身例項
def __next__(self):
while self.i
v =self.a[self.i]
self.i += 1
return
v
else
: self.i = 0
raise stopiteration()
it = iterobj(1採用for迴圈遍歷it = iterobj(for i in it: #呼叫__iter__(),flag=1)next(it)
>>>3
,返回列表b的迭代器
print(i)3.生成器定義生成器有兩種方式:>>> 234
5678
it = iterobj(0) #呼叫__iter__(),flag=0
,返回自身例項迭代器,呼叫__next__()方法
for i in
it: print(i)
>>>357
1113
1719
列表生成器
使用yield
定義生成器函式
列表生成式:
g = (x * 2yieldfor x in range(10
))type(g)
>>>generator
next(g)
>>>4
def gen():yield關鍵字的函式呼叫都是生成器,因為yield會自動建立__iter__()和__next__()for i in range(5
):
yield
i a =gen()
type(a)
>>>generator
next(a)
>>>0
for i in
a: print(i) #從1開始,因為next(a),已經索引了乙個元素
>>>1 23
4next(a)
>>>stopiteration: #終止迭代,只能迭代一次
總結1.__iter__()方法返回迭代器的例項,因為可迭代物件和迭代器都要實現這個方法,所以有兩種方法
寫法一:用於可迭代物件類的寫法,返回該可迭代物件的迭代器類的例項。
寫法二:用於迭代器類的寫法,直接返回self(即自己本身),表示自身即是自己的迭代器
2.可迭代物件,只用__iter__()方法,返回迭代器例項,用iter函式執行裡面內容,生成乙個迭代器
迭代器,同時含有__iter__()方法和__next__()方法,__iter__返回迭代器本身例項,for迴圈執行__next__()內容
生成器,列表生成器(), yield
3.可迭代物件和迭代器最大的區別——能否重複迭代
可迭代物件:能重複迭代,只能用for
迭代器:只能迭代一次,可以通過for或next()迭代
PYTHON 迭代器 可迭代物件
通過重複執行的 處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。1 非迭代例子 loop 0 while loop 3 print hello world loop 1 2 迭代例子 loop...
迭代器和可迭代物件
本篇文章簡單談談可迭代物件,迭代器和生成器之間的關係。三者簡要關係圖 可迭代物件與迭代器 剛開始我認為這兩者是等同的,但後來發現並不是這樣 下面直接丟擲結論 1 可迭代物件包含迭代器。2 如果乙個物件擁有 iter 方法,其是可迭代物件 如果乙個物件擁有next方法,其是迭代器。3 定義可迭代物件,...
可迭代物件和迭代器
建立這個物件的類中是否定義了 iter 方法,如果定義了,那麼這個物件就是可迭代物件。isinstance obj,iterable 判斷 判斷乙個物件是不是迭代器的時候,需要判斷建立這個例項物件的類中是否定義了 iter 方法和 next 方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙...