亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何自定義迭代器

發布時間:2022-03-15 13:47:47 來源:億速云 閱讀:379 作者:小新 欄目:web開發

這篇文章主要介紹了python如何自定義迭代器,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

自定義迭代器

對于新的和經驗豐富的 Python 開發者來說,自定義迭代器是一個非常強大的但令人迷惑的主題。

許多內置類型,例如列表、集合和字典,已經實現了允許它們在底層迭代的協議。這使我們可以輕松地遍歷它們。

>>> for food in ['Pizza', 'Fries']:          print(food + '. Yum!') Pizza. Yum!Fries. Yum!

我們如何迭代我們自己的自定義類?首先,讓我們來澄清一些術語。

  • 要成為一個可迭代對象,一個類需要實現 __iter__()

  • __iter__() 方法需要返回一個迭代器

  • 要成為一個迭代器,一個類需要實現 __next__()(或在 Python 2中是 next()),當沒有更多的項要迭代時,必須拋出一個 StopIteration 異常。

呼!這聽起來很復雜,但是一旦你記住了這些基本概念,你就可以在任何時候進行迭代。

我們什么時候想使用自定義迭代器?讓我們想象一個場景,我們有一個 Server 實例在不同的端口上運行不同的服務,如 http 和 ssh。其中一些服務處于 active 狀態,而其他服務則處于 inactive 狀態。

class Server:     services = [        {'active': False, 'protocol': 'ftp', 'port': 21},        {'active': True, 'protocol': 'ssh', 'port': 22},        {'active': True, 'protocol': 'http', 'port': 80},    ]

當我們遍歷 Server 實例時,我們只想遍歷那些處于 active 的服務。讓我們創建一個 IterableServer 類:

class IterableServer:    def __init__(self):        self.current_pos = 0    def __next__(self):        pass  # TODO: 實現并記得拋出 StopIteration

首先,我們將當前位置初始化為 0。然后,我們定義一個 __next__() 方法來返回下一項。我們還將確保在沒有更多項返回時拋出 StopIteration。到目前為止都很好!現在,讓我們實現這個 __next__() 方法。

class IterableServer:    def __init__(self):        self.current_pos = 0.  # 我們初始化當前位置為 0    def __iter__(self):  # 我們可以在這里返回 self,因為實現了 __next__        return self    def __next__(self):        while self.current_pos < len(self.services):            service = self.services[self.current_pos]            self.current_pos += 1            if service['active']:                return service['protocol'], service['port']        raise StopIteration    next = __next__  # 可選的 Python2 兼容性

我們對列表中的服務進行遍歷,而當前的位置小于服務的個數,但只有在服務處于活動狀態時才返回。一旦我們遍歷完服務,就會拋出一個 StopIteration 異常。

因為我們實現了 __next__() 方法,當它耗盡時,它會拋出 StopIteration。我們可以從 __iter__() 返回 self,因為 IterableServer 類遵循 iterable 協議。

現在我們可以遍歷一個 IterableServer 實例,這將允許我們查看每個處于活動的服務,如下所示:

>>> for protocol, port in IterableServer():         print('service %s is running on port %d' % (protocol, port)) service ssh is running on port 22 service http is running on port 21

太棒了,但我們可以做得更好!在這樣類似的實例中,我們的迭代器不需要維護大量的狀態,我們可以簡化代碼并使用 generator(生成器) 來代替。

class Server:    services = [        {'active': False, 'protocol': 'ftp', 'port': 21},        {'active': True, 'protocol': 'ssh', 'port': 22},        {'active': True, 'protocol': 'http', 'port': 21},    ]    def __iter__(self):        for service in self.services:            if service['active']:                yield service['protocol'], service['port']

yield 關鍵字到底是什么?在定義生成器函數時使用 yield。這有點像 return,雖然 return 在返回值后退出函數,但 yield 會暫停執行直到下次調用它。這允許你的生成器的功能在它恢復之前保持狀態。查看 yield 的文檔以了解更多信息。使用生成器,我們不必通過記住我們的位置來手動維護狀態。生成器只知道兩件事:它現在需要做什么以及計算下一個項目需要做什么。一旦我們到達執行點,即 yield 不再被調用,我們就知道停止迭代。

這是因為一些內置的 Python 魔法。在 Python 關于 __iter__() 的文檔中我們可以看到,如果 __iter__() 是作為一個生成器實現的,它將自動返回一個迭代器對象,該對象提供 __iter__() 和 __next__() 方法。閱讀這篇很棒的文章,深入了解迭代器,可迭代對象和生成器。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“python如何自定義迭代器”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东至县| 扎兰屯市| 玛多县| 唐河县| 丽江市| 德庆县| 儋州市| 达州市| 裕民县| 汶上县| 象州县| 邵阳市| 龙井市| 鄱阳县| 黎平县| 大悟县| 庆元县| 喀什市| 竹溪县| 福建省| 盈江县| 墨竹工卡县| 怀来县| 凤翔县| 陆丰市| 卢龙县| 徐州市| 聂拉木县| 太白县| 寿光市| 锡林浩特市| 洛扎县| 雷波县| 南皮县| 延寿县| 上虞市| 土默特左旗| 新沂市| 喀喇沁旗| 普宁市| 瑞安市|