![](../../img/interpret.jpg)
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, |
> |
參考資料
- https://docs.python.org/3.12/tutorial/classes.html#iterators
- https://docs.python.org/3.12/library/stdtypes.html#iterator-types
- https://docs.python.org/3/glossary.html#term-iterable
![](../../img/pydoing.gif)