亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中的迭代器

系統 2064 0

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

Python有一個在容器上進行迭代的概念。其實現需要兩個方法來支持;這讓用戶自己定義的類也可以支持迭代。序列類型都支持迭代方法。

容器對象需要提供一個方法來提供對于迭代的支持:

container.__iter__():這個方法返回一個迭代器對象。這個對象必須支持后面所描述的迭代器協議。如果一個容器要支持不同類型的迭代,則可以提供額外的方法來專門為這些迭代類型請求相應的迭代器。(對象支持多種迭代形式的一個例子就是樹數據結構中對廣度優先和深度優先遍歷的支持)。這個方法對應于Python/C API中Python對象類型結構體中的tp_iter字段。

迭代器對象自身必須具有如下兩個方法,這兩個方法一起就構成了迭代器協議:

iterator.__iter__()

返回迭代器對象自身。這是為了讓容器和迭代器都能支持for和in語句。這個方法對應于Python/C API中Python對象類型結構體中的tp_iter字段。

iterator.__next__()

返回容器中的下一個元素。如果沒有更多的元素了,就會拋出StopIteration異常。這個方法對應于Python/C API中Python對象類型結構體中的tp_iternext字段。

Python定義了幾種迭代器對象來支持對常規和特定序列類型、字典和其它特殊類型的迭代。特定類型主要地,就是實現了迭代器協議而已。

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

以上是文檔中對迭代器類型相關的介紹,其中的核心就是迭代器對象——也就是實現了迭代器協議的對象。為此我們先根據文檔中的說明定義自己的一個迭代器:

            
              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)


            
          

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

現在我們實現了迭代器,如果想要讓容器支持迭代器協議,按照上面文檔的說法,就應該在一個容器內部定義一個__iter__()方法,并且要求其返回一個迭代器對象,我寫了一個簡單的支持迭代的容器類,它可以支持正序和反序迭代容器中的內容:

            
              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內置函數用來獲取list類型的迭代器,用來支持默認的正序迭代;為了支持反序迭代,我自己實現了一個迭代器,根據容器的創建參數,容器的__iter__()方法會返回不同類型的迭代器,以支持不同類型的迭代。

最后,幾點總結:

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

以上。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一区二区三| 特级毛片免费观看视频 | 五月天堂婷婷 | 99久久国产免费福利 | 国产欧美一区二区三区观看 | 久久精品一区二区三区不卡牛牛 | 国产在线中文字幕 | 成人久久精品 | 精品福利一区 | 欧美在线播放一区二区 | 在线五月婷婷 | 国产精品亚洲精品不卡 | 久久精品国产主播一区二区 | 中文字幕中文字幕中中文 | 天天操操操 | 国产免费一级高清淫日本片 | 四虎影院在线观看网站 | 国产欧美亚洲精品 | 一本大道久久a久久综合 | 99re7在线精品免费视频 | 全部费免一级毛片不收费 | 超级97碰碰碰碰久久久久最新 | 亚欧成人毛片一区二区三区四区 | 国产午夜精品不卡观看 | 一级成人毛片免费观看 | 欧美午夜激情影院 | 最新精品国产 | 俺去也理论网站 | 手机在线中文字幕 | 国产成人亚洲精品久久 | 欧美精品四虎在线观看 | 香蕉在线精品一区二区 | 国产精品视频久久 | 羞羞的视频网站 | 浮力影院欧美三级日本三级 | 久久久久久天天夜夜天天 | 最新国产精品亚洲 | 国产成人久视频免费 | f性欧美 | 在线免费观看亚洲 | jizz中国zz女女18 |