Python3 迭代器迭代物件疑問的總結

2022-06-07 01:06:10 字數 3477 閱讀 3318

1.可迭代物件iterable和迭代器iterator的區別

iterable中實現__iter__方法,__iter__方法會返回乙個iterator。注意,這裡返回的是乙個迭代器。自定義可迭代類的時候,要返回乙個迭代器,不能return self,自己不是乙個迭代器。

迭代器繼承自iterable,實現__next__,可以重寫__iter__。自定義乙個迭代器,__iter__中可以return self,自己實現了__next__,就是個迭代器。

2.iter()方法做了什麼?

l = [1,2,3,4]

a =iter(l)

#iter()呼叫了列表的__iter__,返回l迭代器物件,使a能使用__next__

3.for迴圈原理

for 迴圈在工作時,首先會呼叫可迭代物件內建的iter方法拿到乙個迭代器物件,然後再呼叫該迭代器物件的next方法將取到的值賦給item,執行迴圈體完成一次迴圈,周而復始,直到捕捉stopiteration異常,結束迭代

4.getitem 也是模擬的返回乙個迭代器

for迴圈中,如果物件沒有__iter__,但是實現了__getitem__,會改用下標迭代的方式

class

person:

def__init__

(self,persion_list):

self.persion_list=persion_list

def__getitem__

(self, item):

return

self.persion_list[item]

body=person(["

xiuwu

","adny

","maggie"])

for i in

body:

print (i)

當for發現沒有__iter__但是有__getitem__的時候,會從0開始依次讀取相應的下標,直到發生indexerror為止,這是一種舊的迭代協議。

5.有些可迭代物件中__iter__,返回的是return iter(some_cls),這裡 __iter_ 方法 是需要通過 iter() 顯示的轉成 iterator.

class test: #

test 類支援迭代協議,因為它定義有__iter__()函式

def__iter__

(self):

self.result=[1,2,3]

return iter(self.result) #

返回的是可迭代物件

a =test()

print

(type(a))

b = iter(a) #

b 擁有了__next__方法(next(b)),呼叫a的__iter__方法

print(next(b))

6.自定義迭代器

class

person:

def__init__

(self):

self.n =0

def__iter__

(self):

return self

def__next__(self):

while

true:

if self.n > 6:

raise

stopiteration

self.n += 1

return

self.n

a =person()

b =iter(a)

#print(next(b))

#print(next(b))

#print(next(b))

#print(next(b))

#print(next(b))

#print(next(b))

#print(next(b))

#print(next(b))

for i in

iter(a):

print("sd"

)

print(i)

from collections import

iterable, iterator

class

person:

def__init__

(self, persion_list):

self.persion_list =persion_list

def__iter__

(self):

return myiterator(self.persion_list) #

呼叫我們重寫的迭代器方法

#def __iter__(self):

#return 1

#def __getitem__(self, item): #把這個方法用我們自己寫的迭代器方法替代.

#return self.persion_list[item]

class myiterator(iterator): #

繼承iterator 就不需要寫__iter__,直接呼叫父類的.

def__init__

(self,persion_list):

self.persion_list=persion_list

self.index=0 #

由於iterator 是沒有index 的,這個要我們手動新增

def__next__(self): #

這個就是迭代器的取值邏輯

while true: #

當為false 的時候結束迴圈

try:

word = self.persion_list[self.index] #

取值動作

except indexerror: #

index 當變得超出persion_list 會報錯的 ,先抓住這個異常

raise stopiteration #

迭代到沒有值要用這異常,咱們把異常做個轉化

self.index = self.index + 1 #

遞增我們的index

return word #

返回取到的值

body = person(["

xiuwu

", "

adny

", "

maggie"])

a=iter(body) #

呼叫我們自定義的迭代器方法

print(a) #

<__main__.myiterator object at 0x00000000022399b0>

#從列印結果看說明我們自定義的迭代器方法生效了,已經返回乙個迭代器

print(next(a)) #

xiuwu

#從列印結果我們判斷出 __next__生效,如果想迴圈輸出,自己試試for 迴圈.

python3 迭代器 python3 迭代器

auther aaron fan 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinsta...

Python3 可迭代 和 迭代器

可迭代iterable 可用for迴圈的資料型別 1.集合資料型別,如list,tuple,dict,set,str等 2.generator,包括生成器和帶yield的generator function 生成器不但可以作用於for迴圈,還可以被next 函式不斷呼叫並返回下乙個值,直到最後丟擲s...

Python3 可迭代物件 迭代器與生成器

提問 from collections import iterator,generator a a 2for a in range 10 print isinstance a,iterator true print isinstance a,generator true序列可以迭代的原因 bifit...