天天看點

python 三大器之疊代器疊代器 - iterator

疊代器 - 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))
           
python 三大器之疊代器疊代器 - iterator

網上看到一段代碼,挺不錯,共享給大家:

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=' ')
           
python 三大器之疊代器疊代器 - iterator

繼續閱讀