Python 叠代器協議以及可叠代對象、叠代器對象
阿新 • • 發佈:2017-07-24
統一 for循環 無法 缺點 import ins 一個 需要 實現
一、叠代器協議定義:
叠代:是一個重復的過程,每一次重復,都是基於上一次的結果而來
while True: #單純的重復 print(‘你瞅啥‘) l=[‘a‘,‘b‘,‘c‘,‘d‘] count=0 while count < len(l): print(l[count]) count+=1
叠代器協議是指:對象必須提供一個next方法,執行該方法要麽返回叠代中的下一項,要麽就引起一個StopIteration異常,以終止叠代 (只能往後走不能往前退)
二、可叠代對象定義:
實現了叠代器協議的對象(如何實現:對象內部定義一個__iter__()方法)是對象下有__iter__方法:對象.__iter__,該對象就是可叠代對象
s=‘hello‘ l=[‘a‘,‘b‘,‘c‘,‘d‘] t=(‘a‘,‘b‘,‘c‘,‘d‘) dic={‘name‘:‘egon‘,‘sex‘:‘m‘,"age":18} set1={1,2,3} f=open(‘db.txt‘) s.__iter__() l.__iter__() t.__iter__() dic.__iter__() set1.__iter__() f.__iter__() 以上都是可叠代對象
三、叠代器對象定義:
可叠代對象執行內置的__iter__方法,得到的結果就是叠代器對象
1、有__iter__,執行得到仍然是叠代本身
2、有__next__
3、不依賴於索引的取值方式
dic={‘name‘:‘egon‘,‘sex‘:‘m‘,"age":18} i=dic.__iter__() # print(i) #iterator叠代器 # i.__next__() #next(i) print(next(i)) print(next(i)) print(next(i)) print(next(i)) #StopIteration l=[‘a‘,‘b‘,‘c‘,‘d‘] i=l.__iter__() print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) #StopIteration
四、叠代器對象的優點
1:提供了一種統一的(不依賴於索引的)叠代方式
2:叠代器本身,比起其他數據類型更省內存
l=[‘a‘,‘b‘,‘c‘,‘d‘] i=iter(l) dic={‘a‘:1,‘b‘:2} x=dic.keys() print(x) i=x.__iter__() with open(‘a.txt‘) as f: # print(next(f)) # print(next(f)) # print(next(f)) f.read()
五、叠代器對象的缺點
1:一次性,只能往後走,不能回退,不如索引取值靈活
2:無法預知什麽時候取值結束,即無法預知長度
l=[‘a‘,‘b‘,‘c‘,‘d‘] i=iter(l) print(next(i)) print(next(i)) print(next(i))
六, for循環與可叠代對象
凡是可for循環的都是可叠代的對象
l=[‘a‘,‘b‘,‘c‘,‘d‘] for item in l: #iter_l=l.__iter__() print(item) for item in {1,2,3,4}: print(item)
七、判斷可叠代對象與叠代器對象
需要from collections import Iterable,Iterator
用其中的isinstance()來判斷是否是可叠代對象與叠代器對象
from collections import Iterable,Iterator s=‘hello‘ l=[‘a‘,‘b‘,‘c‘,‘d‘] t=(‘a‘,‘b‘,‘c‘,‘d‘) dic={‘name‘:‘egon‘,‘sex‘:‘m‘,"age":18} set1={1,2,3} f=open(‘a.txt‘) #判斷可叠代對象 print(isinstance(s,Iterable)) print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(dic,Iterable)) print(isinstance(set1,Iterable)) print(isinstance(f,Iterable)) #判斷叠代器對象 print(isinstance(s,Iterator)) print(isinstance(l,Iterator)) print(isinstance(t,Iterator)) print(isinstance(dic,Iterator)) print(isinstance(set1,Iterator)) print(isinstance(f,Iterator))
Python 叠代器協議以及可叠代對象、叠代器對象