Python 速查手冊

6.12 迭代器

迭代器 (iterator) 是種可依序產生數值的資料型態 (data type) ,數值可以由計算產生,也可以是從已經儲存的資料中取得,迭代器物件 (object) 主要用在 for 迴圈 (loop) 中,由 for 迴圈依序取得數值及處理。

例如串列 (list) 是容器物件,變數 (variable) a 為含有五個整數的串列,利用內建函數 (built-in function) iter() 取得 a 的迭代器物件 b ,然後用 next() 取得 b 的第一個數值,接著在 for 迴圈中印出剩下的所有數值,事實上,串列本身就是種可迭代的資料型態,因此串列本來就能用於 for 迴圈

a = [3, 3, 3, 3, 3]

if __name__ == "__main__":
    b = iter(a)
    print(next(b))
    for i in b:
        print(i)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:iterator01.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 iterator01.py
3
3
3
3
3
$

基本上迭代器類別 (class) 需要實作兩個預設方法 (method) ,其一為 __iter__() ,另一個為 __next__() ,前者用來回傳物件實體本身,後者則用來取得下個數值

__iter__()
__next__()

這裡用計算費氏數列的 Fibs 類別當例子,說明如何定義迭代器類別,首先, __iter__() 方法回傳 self ,也就是物件實體 (instance) 自己,然後 __next__() 方法計算迭代器物件要取得的數值,由於此例是計算費氏數列,屬性 i 為第一個數字, j 則是第二個數字,因此計算過程為 i + j 重新指派給 jj 指派給 i ,最後回傳 i

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

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:iterator02.py
# 功能:示範定義類別
# 作者:張凱慶

實際計算到大於 1000 的數字,結果得到 1597

from iterator02 import Fibs

if __name__ == "__main__":
    fibs = Fibs()
    for f in fibs:
        print(f)
        if f > 1000:
            break

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:iterator03.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 iterator03.py
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597

產生器 (generator) 是用關鍵字 (keyword) yield 在函數 (function) 中產生數值,使函數回傳產生器物件,基本上產生器物件就是種簡化版本的迭代器物件,簡單來說,如果只需要用函數產生數值,用產生器即可,反之需要更複雜的設計,就需要自行定義迭代器類別了。

上一頁: 6.11 __del__()
Python 速查手冊 - 目錄
下一頁: 6.13 物件模型
回 Python 教材首頁