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)教學