Python 簡易手冊

單元 66 - 迭代器

迭代器 (iterator) 是依規則產生數值的資料型態 (data type) ,依資料模型 (data model) ,定義迭代器類別 (class) 必須定義 __iter__()__next__() 兩個方法 (method) ,有些物件是可迭代的 (iterable) ,例如序列 (sequence) 的串列 (list) 、字串 (string) 、序對 (tuple) 等,可迭代型態的特點是可以用在 for 迴圈 (loop) 依序取出元素 (element) ,可迭代的類別需要定義 __iter__()__getitem__() 方法。

單元 50 - 產生器介紹的產生器 (generator) 其實就是迭代器的語法糖,單元 60 - 資料類別與資料模型簡介資料模型,單元 39 - 串列介紹串列,單元 33 - 字串介紹字串,單元 38 - 序對與 Range介紹序對,單元 23 - for 陳述介紹如何使用 for 陳述 (statement) 。

迭代器跟可迭代最大的不同是前者依規則計算出數值,可迭代則是從已有的元素取出數值,以下為定義迭代器的簡單例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 定義迭代器類別
class Demo:
    # 定義建構子
    def __init__(self, number):
        # 設定數列數量
        self.number = number
        # 計數
        self.count = 1

    def __iter__(self):
        # 初始設定
        self.n1 = 0
        self.n2 = 1
        return self

    def __next__(self):
        # 計算下一個數字
        if self.count <= self.number:
            # 處理第一個數字
            if self.count == 1:
                self.count += 1
                return self.n1
            # 處理第二個數字
            elif self.count == 2:
                self.count += 1
                return self.n2
            # 處理第三個及其後的數字
            else:
                self.count += 1
                self.n = self.n1 + self.n2
                self.n1 = self.n2
                self.n2 = self.n
                return self.n
        else:
            # 結束處理
            raise StopIteration

# 印出到第 20 個費氏數列
d = Demo(20)
for i in d:
    print(i, end=", ")
print()

# 檔名: class_demo32.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

這個迭代器是計算費式數列, __iter__() 為迭代器計算數值的初始設定

10
11
12
13
14
    def __iter__(self):
        # 初始設定
        self.n1 = 0
        self.n2 = 1
        return self

__next__() 則是計算規則,用以計算出下一個數值,當結束的時候利用關鍵字 (keyword) raise 發起 StopIteration

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    def __next__(self):
        # 計算下一個數字
        if self.count <= self.number:
            # 處理第一個數字
            if self.count == 1:
                self.count += 1
                return self.n1
            # 處理第二個數字
            elif self.count == 2:
                self.count += 1
                return self.n2
            # 處理第三個及其後的數字
            else:
                self.count += 1
                self.n = self.n1 + self.n2
                self.n1 = self.n2
                self.n2 = self.n
                return self.n
        else:
            # 結束處理
            raise StopIteration

單元 27 - raise 陳述介紹如何使用 raise 陳述。

底下執行部分建立 Demo(20) ,然後用 for 迴圈依序印出計算出的數字,執行結果如下

> python class_demo32.py
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181,
>

參考資料

上一頁 單元 65 - 抽象方法
回 Python 簡易手冊 首頁
下一頁 單元 67 - 泛型
回 Python 教材首頁
回程式語言教材首頁