日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python中的迭代器

系統(tǒng) 2016 0

以下是Python文檔中對(duì)于迭代器類型的描述

Python有一個(gè)在容器上進(jìn)行迭代的概念。其實(shí)現(xiàn)需要兩個(gè)方法來(lái)支持;這讓用戶自己定義的類也可以支持迭代。序列類型都支持迭代方法。

容器對(duì)象需要提供一個(gè)方法來(lái)提供對(duì)于迭代的支持:

container.__iter__():這個(gè)方法返回一個(gè)迭代器對(duì)象。這個(gè)對(duì)象必須支持后面所描述的迭代器協(xié)議。如果一個(gè)容器要支持不同類型的迭代,則可以提供額外的方法來(lái)專門(mén)為這些迭代類型請(qǐng)求相應(yīng)的迭代器。(對(duì)象支持多種迭代形式的一個(gè)例子就是樹(shù)數(shù)據(jù)結(jié)構(gòu)中對(duì)廣度優(yōu)先和深度優(yōu)先遍歷的支持)。這個(gè)方法對(duì)應(yīng)于Python/C API中Python對(duì)象類型結(jié)構(gòu)體中的tp_iter字段。

迭代器對(duì)象自身必須具有如下兩個(gè)方法,這兩個(gè)方法一起就構(gòu)成了迭代器協(xié)議:

iterator.__iter__()

返回迭代器對(duì)象自身。這是為了讓容器和迭代器都能支持for和in語(yǔ)句。這個(gè)方法對(duì)應(yīng)于Python/C API中Python對(duì)象類型結(jié)構(gòu)體中的tp_iter字段。

iterator.__next__()

返回容器中的下一個(gè)元素。如果沒(méi)有更多的元素了,就會(huì)拋出StopIteration異常。這個(gè)方法對(duì)應(yīng)于Python/C API中Python對(duì)象類型結(jié)構(gòu)體中的tp_iternext字段。

Python定義了幾種迭代器對(duì)象來(lái)支持對(duì)常規(guī)和特定序列類型、字典和其它特殊類型的迭代。特定類型主要地,就是實(shí)現(xiàn)了迭代器協(xié)議而已。

一旦迭代器的__next__()方法拋出了StopIteration異常,隨后的調(diào)用中也必須這樣做。不遵守此種行為的情況被視為迭代器已損壞。

以上是文檔中對(duì)迭代器類型相關(guān)的介紹,其中的核心就是迭代器對(duì)象——也就是實(shí)現(xiàn)了迭代器協(xié)議的對(duì)象。為此我們先根據(jù)文檔中的說(shuō)明定義自己的一個(gè)迭代器:

            
              class SimpleIterator:
    def __init__(self, max_index, position=0):
        self._position = position
        self._max = max_index

    def __iter__(self):
        return self

    def __next__(self):
        current_position = self._position
        if current_position <= self._max:
            self._position += 1
            return current_position
        else:
            raise StopIteration


if __name__ == '__main__':
    simple_iterator = SimpleIterator(100)
    for item in simple_iterator:
        print(item)


            
          

這是一個(gè)非常簡(jiǎn)單的迭代器,在其上迭代可以依次訪問(wèn)從初始化的position到max_index的所有整型數(shù),并且是個(gè)閉區(qū)間(我在條件中使用了<=)。

現(xiàn)在我們實(shí)現(xiàn)了迭代器,如果想要讓容器支持迭代器協(xié)議,按照上面文檔的說(shuō)法,就應(yīng)該在一個(gè)容器內(nèi)部定義一個(gè)__iter__()方法,并且要求其返回一個(gè)迭代器對(duì)象,我寫(xiě)了一個(gè)簡(jiǎn)單的支持迭代的容器類,它可以支持正序和反序迭代容器中的內(nèi)容:

            
              class ReverseIterator:
    def __init__(self, seq=[]):
        self._seq = seq
        self._current_index = len(self._seq) - 1

    def __iter__(self):
        return self

    def __next__(self):
        if self._current_index < 0:
            raise StopIteration
        use_index = self._current_index
        self._current_index -= 1
        return self._seq[use_index]


class SimpleContainer:
    def __init__(self, seq=[], reverse=False):
        self._seq = seq
        self._reverse = reverse

    def __iter__(self):
        if not self._reverse:
            return iter(self._seq)
        else:
            return ReverseIterator(self._seq)


if __name__ == '__main__':
    print("reverse=False")
    simple_container = SimpleContainer([1, 2, 3], reverse=False)
    for item in simple_container:
        print(item)

    print("reverse=True")
    simple_container = SimpleContainer([1, 2, 3], reverse=True)
    for item in simple_container:
        print(item)


            
          

這里面,我使用了iter內(nèi)置函數(shù)用來(lái)獲取list類型的迭代器,用來(lái)支持默認(rèn)的正序迭代;為了支持反序迭代,我自己實(shí)現(xiàn)了一個(gè)迭代器,根據(jù)容器的創(chuàng)建參數(shù),容器的__iter__()方法會(huì)返回不同類型的迭代器,以支持不同類型的迭代。

最后,幾點(diǎn)總結(jié):

  • __iter__()方法總是返回迭代器對(duì)象;
  • __next__()方法需要在迭代器中返回下一個(gè)值;
  • 迭代器對(duì)象中的__iter__()方法主要目的是為了讓迭代器對(duì)象自身也支持for和in語(yǔ)句;
  • 可以根據(jù)容器設(shè)置的條件,指定使用不同類型的迭代器;
  • 要避免在迭代器協(xié)議實(shí)現(xiàn)的過(guò)程中復(fù)制底層容器對(duì)象(比如通過(guò)list[::-1]表達(dá)式來(lái)獲取一個(gè)反序的新列表),防止內(nèi)存資源浪費(fèi);

以上。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 台东市| 井研县| 鄂托克前旗| 那坡县| 阿拉尔市| 临夏县| 睢宁县| 南川市| 康马县| 神木县| 丹棱县| 星子县| 故城县| 灵武市| 西平县| 邹城市| 娄烦县| 济源市| 铜川市| 安丘市| 游戏| 万载县| 靖州| 福清市| 谢通门县| 五河县| 合川市| 久治县| 朝阳市| 莱芜市| 泾阳县| 巧家县| 邢台县| 盐山县| 东山县| 铅山县| 奎屯市| 盐源县| 若尔盖县| 林甸县| 承德市|