疊代器 - iterator
首先了解一下可疊代對象(iterable)
疊代器一定是可疊代對象,但是可疊代對象不一定是疊代器。
簡單而言,可以用for循環周遊的,都是可疊代對象。 list,tuple,str都是可疊代對象,但是他們不一定是疊代器。疊代器本身不知道自己要執行多少次,是以可以了解為不知道有多少個元素,每調用一次next(),就會往下走一步,是惰性的。
疊代器提供了一種不依賴索引取值的方式,這樣可以周遊沒有索引的可疊代對象,比如字典、集合、檔案等等,加載這一個元素至記憶體中随後釋放,相比之下更節省記憶體,但是我們沒有辦法擷取疊代器的長度,而且隻能往後依次取值。
Python中疊代器的本質上每次調用__next__()方法都傳回下一個元素或抛出StopIteration的容器對象
疊代器
由于Python中沒有“疊代器”這個類,是以具有以下兩個特性的類都可以稱為“疊代器”類:
1、有__next__()方法,傳回容器的下一個元素或抛出StopIteration異常
2、有__iter__()方法,傳回疊代器本身
#可疊代對象
from collections import Iterable
# 疊代器
from collections import Iterator
# 将可疊代對象轉換成疊代器
list1 = list(range(1,101))
#強轉
res = iter(list1)
print(res)
print(type(res))
print(isinstance(res,Iterator)) # 判斷是否是疊代器
#print(isinstance({1},Iterable)) 判斷是否是可疊代對象,(可疊代對象可用for循環周遊)
print(next(res))
網上看到一段代碼,挺不錯,共享給大家:
class Fabs():
def __init__(self,max):
self.max=max
self.n,self.a,self.b=0,0,1
def __iter__(self):#定義__iter__方法
return self
def __next__(self):#定義__next__方法
if self.n<self.max:
tmp=self.b
self.a,self.b=self.b,self.a+self.b
#等價于:
#t=(self.a,self.a+self.b)
#self.a=t[0]
#self.b=t[1]
self.n+=1
return tmp
raise StopIteration
print(Fabs(5))
for item in Fabs(10):
print(item,end=' ')