iterator

關於iterator ,本節主要講如下幾方面python

第一 、什麼是迭代。什麼是可迭代的,也就是iterable。網站

第2、這些容器,和iterator 是什麼關係。iterator又是什麼?spa

第3、__iter__ 方法 和__next__方法 ,建立一個迭代器對象。對象

 

第1、什麼是迭代。什麼是可迭代的。blog

看了不少篇文章所,說迭代就是 ,被for循環做用,循環出來一個一個值就,這種遍歷就叫作迭代(沒毛病),那麼什麼是iterable ,就是可迭代的對象,簡單來說就是能被for循環迭代的對象,稱這些對象爲可迭代的,例如能被for循環做用的有str ,list , tuple ,dict , set。這5種都是iterable內存

 

第2、這些容器,和iterator 是什麼關係。iterator又是什麼?utf-8

我在外國網站上,看到那些能存放多個元素的數據類型都叫作容器(container),就是這個幾個str ,list , tuple ,dict , set ,而咱們上文提到過,這些是能夠被for循環做用,讀取其中每個元素的,資源

那麼能被for循環是container的特性 嗎?不,我有一篇文章寫過生成器,爲何會出現生成器這個東西,其實就是由於不想這些容器,放很是多的元素,而後一次性加載到內存中,這樣佔用很是大的資源。generator

一樣的道理,iterator 就是解決這個問題的,迭代器是訪問集合元素的一種方式,從頭訪問到尾,迭代器不要求你實現,提早將被迭代的元素轉備好,而是能夠迭代到具體元素時在計算出該元素。it

(這他媽不就是生成器嗎?我此時內心想的是,因此我想了一些generator和iterator的區別,下面講)。而被迭代以前,這個元素是能夠不存在的,很簡單是由於被計算出來的。因此咱們這些container在被for循環做用時,其實是經過iter()方法,將容器變成了一個iterator。而後,經過next()方法調用這個iterator,next()作兩件事,第一個是返回當前元素,第二個是爲返回下一個元素作準備,請看下面一個示例

 

# -*- coding: utf-8 -*-
#@Author: Eric



class Myiterator():
    def __init__(self,itertable):
        self.iterable = itertable
        self.index = 0


    def __iter__(self):

        return self


    def __next__(self):

        while True:
            try:
                value = self.iterable[self.index]

                self.index+=1
            except StopIteration as e:
                print('迭代完成了')

            return value

obj =Myiterator([1,3,4,5,6,7])

print(obj)
print(next(obj))
print(next(obj))

  

 上述這個實例 ,的__iter__方法就是,系統內置的iter()方法 ,將可迭代的對象放入iter()方法中,返回一個迭代器iterator , ,而迭代器是能夠被for做用迭代的,內部實現的過程,就類型裏面的,__next__()裏面的方法。

 

第3、__iter__ 方法 和__next__方法 ,建立一個迭代器對象。

在提這兩個方法以前,咱們先說一下迭代器協議 :迭代器對象必須有一個next() 方法,next()執行,只有兩個結果,要麼是返回迭代器對象的下一個元素,要麼是是出發Stopiteration的報錯

而咱們上文提到了iter()和next()兩個方法 ,其實對應在內部實現的就是,__iter__ 方法 和__next__方法。__iter__() 方法是用來返回一個迭代器,而迭代器是經過迭代器協議規定,只須要包含一個符合規則的next(),那麼這個東西就是迭代器,

而迭代器自己也是能夠迭代的,因此,上面代碼中,返回了self就是能夠理解的。由於上面那麼類,自己就是爲了實例化一個迭代器的。

 

 

總結一下 :一、迭代是一個過程 , 就是被for循環做用,從前到後循環讀取一個一個元素的過程,直到循環完全部元素。

                   二、 迭代器, 實際上是一種從容器中中獲取元素的一種方式 ,從頭至尾,並且不須要你提早將被迭代的全部數據提早準備好,只須要被迭代時被計算出來便可。

                   三、迭代器協議,規定迭代器對象中要包含__iter__(),返回本身,而且自身含有__next__()方法做用,返回iterator的下一個元素,或者在迭代結束時,抓取Stopiteration的異常。

                  四、 什麼是可迭代的對象, 就是指上文提到的那些容器 ,能夠被iter()生成一個迭代器 。生成一個迭代器起了,天然不就有next()方法了,也就能被迭代了。

相關文章
相關標籤/搜索