Python:迭代器

在Python中,迭代器是一個(gè)很重要的東西。良好的迭代器定義,能讓代碼更加清晰。

定義一個(gè)迭代器需要實(shí)現(xiàn)兩個(gè)方法__iter____next__。

__iter__返回迭代器對象本身。它是必需的,以允許容器和迭代器在for .. in ..語句中使用。
__next__返回下一個(gè)元素。當(dāng)沒有元素可返回時(shí),應(yīng)拋出StopIteration

class X2:
    def __init__(self, n: int):
        self.list = [x*x for x in range(n)]
        self.__count = -1

    def __iter__(self):
        return self

    def __next__(self):
        self.__count += 1
        try:
            return self.list[self.__count]
        except IndexError:
            raise StopIteration


if __name__ == "__main__":
    for each in X2(10):
        print(each)

但這樣定義似乎有些太麻煩了,Python提供了一個(gè)更加簡略的方法:

def X2(n: int):
    for i in range(n):
        yield i*i


if __name__ == "__main__":
    for each in X2(10):
        print(each)

事實(shí)上,如下代碼

    for each in X2(10):
        print(each)

    t = X2(10)
    while True:
        try:
            each = t.__next__()
        except StopIteration:
            break
        print(each)

是等價(jià)的。

能看出,for .. in ..的運(yùn)行機(jī)制,就是不斷地調(diào)用被迭代對象的.__next__()方法,直到捕獲到StopIteration異常。

明白了這一點(diǎn),很容易就能知道,Python的死循環(huán)寫法至少有兩種:while True:和使用for .. in ..迭代一個(gè)擁有__iter____next__方法的對象,并且這個(gè)對象的__next__方法永遠(yuǎn)不會拋出StopIteration異常。

附:next(g)g.__next__()都是調(diào)用了g__next__()方法,只不過next(g)可能看起來更友好一點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:深入講解Python中的迭代器和生成器 在Python中,很多對象都是可以通過for語句來直接遍歷的,例如...
    bobobe閱讀 1,098評論 2 4
  • 迭代是訪問集合元素的一種方式。迭代器是一個(gè)可以記住遍歷的位置的對象。迭代器對象從集合的第一個(gè)元素開始訪問,直到所有...
    youngkun閱讀 665評論 0 0
  • 住的這個(gè)小區(qū)也建好幾年了,怎么周圍一直在裝修,鉆啊鉆啊。于是開大音樂,擋住鉆的聲音,周期性重復(fù)的聲音實(shí)在是亂人心緒...
    KevinCool閱讀 878評論 1 1
  • 一些基本概念 1 容器 可以詢問某個(gè)元素是否包含其中,如list,set,tuples,dict等都是容器 2 迭...
    和黑黑閱讀 755評論 0 5
  • https://zhuanlan.zhihu.com/p/26123333 要完全理解透生成器,需要我們先掌握三個(gè)...
    Lauzanhing閱讀 459評論 0 0

友情鏈接更多精彩內(nèi)容