迭代器 (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__() ,前者用來回傳物件實體本身,後者則用來取得下個數值
__next__()
這裡用計算費氏數列的 Fibs 類別當例子,說明如何定義迭代器類別,首先, __iter__() 方法回傳 self ,也就是物件實體 (instance) 自己,然後 __next__() 方法計算迭代器物件要取得的數值,由於此例是計算費氏數列,屬性 i 為第一個數字, j 則是第二個數字,因此計算過程為 i + j 重新指派給 j , j 指派給 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) 中產生數值,使函數回傳產生器物件,基本上產生器物件就是種簡化版本的迭代器物件,簡單來說,如果只需要用函數產生數值,用產生器即可,反之需要更複雜的設計,就需要自行定義迭代器類別了。
相關教學影片