迭代協定與原理

我認為迭代是程式很重要的一部分,而 Python 的迭代是在是太方便太強大了,因此我們有必要深入了解 Python 迭代的機制和原理,相信讀者閱讀完本章會對 Python 的迭代有更深一層的認識。

既然講到了,就不得不來介紹一下何謂 協定,顧名思義,協定指的是合作雙方在溝通時所認定的標準和規則,Python 中也有很多的協定,當一個 Python 類別 (物件) 滿足實作實現 了某項協定,就等於賦予了該類別 (物件) 相當的地位,能夠被相關的操作所支援。

舉例來說,若類別實作了 長度協定,也就是類別中有定義方法 __len__,則該類別的實例就能夠被內建函式 len 支援,如下:

class Pen:
    """simple class which implements __len__ """
    def __init__(self, length):
        self.length = length

    def __len__(self):
        return self.length
>>> pen = Pen(5)
>>> len(pen)
5

其實在 Python 中充斥著大量類似的協定,且存在著明確的對應規則。

舉例來說,許多的內建函式在被呼叫的時候,都會去調用引數物件對應的 dunder method (就是以雙底線開頭和結尾的特殊方法,也有人稱為魔術方法),例如 len(obj) 實際上會去呼叫 obj.__len__(),而 str(obj) 會去呼叫 obj.__str__(),像這些內與外的對應規則就是協定。

dunder method 一詞我是在 Fluent Python 一書上看到的,是 double-underline method 的意思。

當然,在 Python 裡面還有更多不同形式的協定,有的更複雜、更精妙。在這裡我們要深入探討的就是迭代的協定和原理,包含了可迭代物的協定和迭代器的協定,會介紹如何使一個 Python 物件成為可迭代物以及如何產生其對應的迭代器。最後對於迭代器的特化種類: 產生器也會有所琢磨。

results matching ""

    No results matching ""