python 可迭代物件和迭代器以及生成器

2022-08-01 04:57:14 字數 3318 閱讀 4207

迭代器、生成器是python學習的重要概念,其在深度學習的資料集載入中應用也非常廣泛。本文主要闡述可迭代物件(iterable),迭代器(iterator)以及生成器(generator)的主要區別

首先,迭代器均為可迭代物件,生成器是特殊的迭代器,三者關係如下

1.可迭代物件(iterable)

乙個物件只要實現了__iter__()方法,那麼它就是可迭代物件,可迭代物件可以被for迴圈使用。

注意,並非所有被for 迴圈使用的都為可迭代物件,類中定義__getitem__(self, index),也可被for迴圈使用,但並非是可迭代物件

但自定義的可迭代物件要能在for迴圈中正確使用,就需要__iter__()實現必須是正確的。定義了__iter__()方法,可以使用iter()函式。

class

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

for i in a:

print(a)

typeerror: 'iterobj' object is not iterable
正確的__iter__()方法要返回乙個迭代器物件,即可以通過內建iter()函式轉成iterator物件

class

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...

2.迭代器(iterator)乙個物件實現了__iter__()和__next__()方法,那麼它就是乙個迭代器物件。

class

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()

next函式,呼叫__next__()方法

it = iterobj(1

)next(it)

>>>3

採用for迴圈遍歷it = iterobj(for i in it: #呼叫__iter__(),flag=1

,返回列表b的迭代器

print(i)

>>> 234

5678

it = iterobj(0) #呼叫__iter__(),flag=0

,返回自身例項迭代器,呼叫__next__()方法

for i in

it: print(i)

>>>357

1113

1719

3.生成器定義生成器有兩種方式:

列表生成器

使用yield定義生成器函式

列表生成式:

g = (x * 2

for x in range(10

))type(g)

>>>generator

next(g)

>>>4

yield

def gen():

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: #終止迭代,只能迭代一次

yield關鍵字的函式呼叫都是生成器,因為yield會自動建立__iter__()和__next__()

總結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 方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙...