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__,會改用下標迭代的方式
classperson:
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()
(type(a))
b = iter(a) #
b 擁有了__next__方法(next(b)),呼叫a的__iter__方法
print(next(b))
6.自定義迭代器
classperson:
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 importiterable, 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...