Python 迭代器(Iterators)深入解析 | Python
2026/04/24
在 Python 中,迭代器(Iterator) 是驅動 for 迴圈運作的核心機制。理解迭代器協議(Iterator Protocol)不僅能讓你更深入了解 Python 的設計哲學,還能幫助你建立高效處理大量資料的自定義物件。
可迭代物件與迭代器的區別
首先要區分兩個概念:可迭代物件(Iterable) 和 迭代器(Iterator)。
- 可迭代物件:實作了
__iter__方法的物件,例如列表、字串、字典。 - 迭代器:同時實作了
__iter__和__next__方法的物件,能逐一產出元素。
my_list = [1, 2, 3]
my_iter = iter(my_list) # 從可迭代物件取得迭代器
print(type(my_list)) # 輸出:<class 'list'>
print(type(my_iter)) # 輸出:<class 'list_iterator'>
iter() 和 next() 內建函式
iter() 會呼叫物件的 __iter__ 方法取得迭代器,next() 則呼叫 __next__ 取得下一個元素:
colors = ["紅", "綠", "藍"]
it = iter(colors)
print(next(it)) # 輸出:紅
print(next(it)) # 輸出:綠
print(next(it)) # 輸出:藍
# print(next(it)) # 會引發 StopIteration 例外
當沒有更多元素時,next() 會引發 StopIteration 例外。
for 迴圈的運作原理
for 迴圈在背後其實是這樣運作的:
# 這段 for 迴圈
for item in [1, 2, 3]:
print(item)
# 等同於以下操作
it = iter([1, 2, 3])
while True:
try:
item = next(it)
print(item)
except StopIteration:
break
建立自定義迭代器
實作 __iter__ 和 __next__ 兩個方法即可建立自定義迭代器:
class CountDown:
def __init__(self, start):
self.current = start
def __iter__(self):
return self
def __next__(self):
if self.current <= 0:
raise StopIteration
value = self.current
self.current -= 1
return value
for num in CountDown(5):
print(num, end=" ")
# 輸出:5 4 3 2 1
再看一個只產出偶數的範例:
class EvenNumbers:
def __init__(self, max_value):
self.max_value = max_value
self.current = 0
def __iter__(self):
return self
def __next__(self):
self.current += 2
if self.current > self.max_value:
raise StopIteration
return self.current
for num in EvenNumbers(10):
print(num, end=" ")
# 輸出:2 4 6 8 10
迭代器的優勢:記憶體效率
迭代器不會一次將所有資料載入記憶體,而是在需要時才產出元素:
import sys
big_list = list(range(1_000_000))
big_iter = iter(range(1_000_000))
print(sys.getsizeof(big_list)) # 輸出:約 8 MB
print(sys.getsizeof(big_iter)) # 輸出:約 48 bytes
實用範例:逐行迭代檔案
檔案物件本身就是迭代器,能以記憶體友善的方式處理大型檔案:
with open("data.txt", "r", encoding="utf-8") as f:
header = next(f) # 讀取標題行
for line in f: # 從第二行開始逐行處理
print(line.strip())
總結
迭代器是 Python 的核心機制之一,它讓 for 迴圈與列表推導式等語法得以運作。透過 __iter__ 和 __next__ 方法,你可以建立自定義迭代器來高效處理各種資料序列。迭代器的惰性求值特性在處理大量資料時具有顯著的記憶體優勢。希望這篇文章能幫助你深入理解迭代器的運作原理。
如果你想複習 for 迴圈的基礎用法,請參考 Python 迴圈(Loop)教學。
關於 __iter__ 和 __next__ 等魔術方法的完整介紹,請閱讀 Python 魔術方法(Magic Methods)教學。