欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python如何自定義迭代器

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

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元都勻做網(wǎng)站,已為上家服務(wù),為都勻各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

自定義迭代器

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

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

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

我們?nèi)绾蔚覀冏约旱淖远x類?首先,讓我們來澄清一些術(shù)語。

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

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

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

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

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

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

當(dāng)我們遍歷 Server 實例時,我們只想遍歷那些處于 active 的服務(wù)。讓我們創(chuàng)建一個 IterableServer 類:

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

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

class IterableServer:    def __init__(self):        self.current_pos = 0.  # 我們初始化當(dāng)前位置為 0    def __iter__(self):  # 我們可以在這里返回 self,因為實現(xiàn)了 __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 兼容性

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

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

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

>>> 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

太棒了,但我們可以做得更好!在這樣類似的實例中,我們的迭代器不需要維護大量的狀態(tài),我們可以簡化代碼并使用 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 關(guān)鍵字到底是什么?在定義生成器函數(shù)時使用 yield。這有點像 return,雖然 return 在返回值后退出函數(shù),但 yield 會暫停執(zhí)行直到下次調(diào)用它。這允許你的生成器的功能在它恢復(fù)之前保持狀態(tài)。查看 yield 的文檔以了解更多信息。使用生成器,我們不必通過記住我們的位置來手動維護狀態(tài)。生成器只知道兩件事:它現(xiàn)在需要做什么以及計算下一個項目需要做什么。一旦我們到達執(zhí)行點,即 yield 不再被調(diào)用,我們就知道停止迭代。

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“python如何自定義迭代器”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

文章題目:python如何自定義迭代器
網(wǎng)站地址:http://chinadenli.net/article20/joeijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)網(wǎng)站排名、用戶體驗、App設(shè)計網(wǎng)頁設(shè)計公司、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
国产欧美日韩精品自拍| 1024你懂的在线视频| 国产一区二区精品丝袜| 精品久久av一二三区| 国产成人亚洲精品青草天美| 久久精品国产亚洲av麻豆尤物| 精品一区二区三区三级视频| 日本高清中文精品在线不卡| 东京热男人的天堂一二三区| 一区二区日韩欧美精品| 色综合久久超碰色婷婷| 一区二区三区四区亚洲另类| 九七人妻一区二区三区| 亚洲欧美日韩综合在线成成| 一区二区欧美另类稀缺| 欧美韩国日本精品在线| 亚洲专区一区中文字幕| 日本高清中文精品在线不卡| 日本欧美一区二区三区就| 亚洲欧美日韩中文字幕二欧美 | 九九热视频经典在线观看| 精品al亚洲麻豆一区| 日韩欧美一区二区黄色| 日本高清加勒比免费在线| 国产熟女一区二区不卡| 91午夜少妇极品福利| 91精品国产综合久久福利| 日韩精品视频一二三区| 日韩一区欧美二区国产| 国产欧美日产中文一区| 中文精品人妻一区二区| 久久精品少妇内射毛片| 日韩欧美中文字幕人妻| 国产传媒欧美日韩成人精品| 97人妻精品一区二区三区男同 | 亚洲精品av少妇在线观看| 中日韩美一级特黄大片| 在线视频免费看你懂的| 欧美老太太性生活大片| 中国美女草逼一级黄片视频| 日韩精品综合免费视频|