Python:迭代器

weixin_34402408發表於2018-02-11

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

定義一個迭代器需要實現兩個方法__iter____next__

__iter__返回迭代器物件本身。它是必需的,以允許容器和迭代器在for .. in ..語句中使用。
__next__返回下一個元素。當沒有元素可返回時,應丟擲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提供了一個更加簡略的方法:

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


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

事實上,如下程式碼

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

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

是等價的。

能看出,for .. in ..的執行機制,就是不斷地呼叫被迭代物件的.__next__()方法,直到捕獲到StopIteration異常。

明白了這一點,很容易就能知道,Python的死迴圈寫法至少有兩種:while True:和使用for .. in ..迭代一個擁有__iter____next__方法的物件,並且這個物件的__next__方法永遠不會丟擲StopIteration異常。

附:next(g)g.__next__()都是呼叫了g__next__()方法,只不過next(g)可能看起來更友好一點。

相關文章