Python 3.1 快速導覽 - 類別 迭代器

for 迴圈可以逐一取得容器 (container) 物件 (object) 的元素 (element) ,然後對元素進行操作。這樣的容器物件屬於複合資料型態 (compound data type) ,具有可被 for 迴圈操作的特性被稱為迭代器 (iterator) 。



若是我們要定義具有迭代器特性的類別 (class) ,我們需要加入 __iter__() 與 __next__() 的定義, __iter__() 回傳 self 本身,而 __next__() 為取得下一個元素的方法 (method) 。


例如以下程式,類別 (class) Fibs 可計算費博納西數列 (Fibonacci series)
class Fibs:
    def __init__(self):
        self.i = 0
        self.j = 1
    
    def __str__(self):
        return str(self.i)
    
    def __iter__(self):
        return self
    
    def __next__(self):
        self.i, self.j = self.j, self.i + self.j
        return self.i

fibs = Fibs()
for f in fibs:
    print(f)
    if f > 10000:
        break

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:iterator.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



__iter__() 就是回傳 self 本身
def __iter__(self):
    return self


__next__() 取得下一個元素,此例中就是前兩個數字相加
def __next__(self):
    self.i, self.j = self.j, self.i + self.j
    return self.i


Fibs 提供的是費伯納西數的迭代計算模式,因此可以很快的計算出費伯納西數列。


中英文術語對照
容器container
物件object
元素element
複合資料型態compound data type
迭代器iterator
類別class
費博納西數列Fibonacci series
方法method
類別class






沒有留言: