Python 中的迭代器
本文將說明 Python 中的迭代器。
YouTube Video
Python 中的迭代器
概述
在 Python 中,迭代器是一個用來逐一處理列表、元組、字典等集合元素的基本機制。
什麼是迭代器?
迭代器是一種可以一次返回一個元素的物件。在 Python 中,滿足以下兩個條件的物件被視為迭代器:。
- 擁有一個
__iter__()方法,並返回自身。 - 擁有一個
__next__()方法,返回下一個元素。當沒有更多元素時,會引發StopIteration例外。
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs- 在此程式碼中,
iter()函數用於將列表轉換為疊代器,next()函數則用於一個接一個地取得並顯示每個元素。
與可迭代物件的區別
可迭代物件是指實現了 __iter__() 方法並且可以在 for 迴圈中被使用的物件。列表和元組就是可迭代物件的例子。
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10- 這段程式碼展示了如何從像列表這樣的可疊代對象取得疊代器,並使用
next()依序取出元素的例子。
檢查方法:
1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable)) # True
7print(isinstance(nums, Iterator)) # False
8print(isinstance(it, Iterator)) # True- 這段程式碼確認了
nums是一個可疊代對象但不是疊代器,而通過iter(nums)得到的it則是一個疊代器。
for 迴圈與迭代器的關係
Python 中的 for 迴圈在內部的運作方式如下:。
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break- 如上所示,
for迴圈會隱式地透過迭代器來進行迭代。
建立自訂迭代器
你可以使用類別來建立自訂的迭代器。
1class Countdown:
2 def __init__(self, start):
3 self.current = start
4
5 def __iter__(self):
6 return self
7
8 def __next__(self):
9 if self.current <= 0:
10 raise StopIteration
11 value = self.current
12 self.current -= 1
13 return value
14
15for num in Countdown(3):
16 print(num) # 3, 2, 1- 這段程式碼定義了一個使用
Countdown類別實現倒數的自訂疊代器,並利用for迴圈印出從 3 到 1 的數字。
迭代器與生成器的區別,以及什麼時候該使用哪一個
生成器提供與迭代器類似的功能。它們可以讓你更簡潔地定義迭代器。
1def countdown(n):
2 while n > 0:
3 yield n
4 n -= 1
5
6for i in countdown(3):
7 print(i) # 3, 2, 1- 這段程式碼定義了一個利用
yield進行倒數的生成器函式,並使用for迴圈印出從 3 到 1 的數字。
迭代器(類別)與生成器(函式)的差異
疊代器(類別)與生成器(函式)之間有以下差異:。
| 特性 | 迭代器(類別) | 生成器(函式) |
|---|---|---|
| 定義方式 | __iter__() + __next__() |
使用 yield 的函式 |
| 狀態管理 | 需手動屬性管理 | 自動維護內部狀態 |
| 可讀性 | 可能變得複雜 | 簡單明瞭 |
-
定義方式的不同 迭代器需手動定義
__iter__()與__next__()這兩個方法。相較之下,生成器只需用yield關鍵字即可定義,語法更為簡潔。 -
狀態管理方式的不同 使用迭代器時,需手動使用變數來管理目前狀態與進度。而生成器則會在 Python 內自動維護狀態,減少人為管理的負擔。
-
程式碼可讀性 迭代器因為需要多個方法及手動管理狀態,所以程式碼可能變得較為複雜。相較下,生成器語法更簡單,即使是初學者也較容易理解。
可用於迭代器的標準函式庫:itertools
itertools 是 Python 的標準函式庫之一,提供了強大的迭代器工具。
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)- 它還內建了許多其他函式,例如:
cycle、repeat、chain、islice、tee等。
迭代器的應用場景
疊代器的使用情境包括以下幾種:。
- 逐行處理檔案:以迭代器方式逐行讀取檔案。
- 節省記憶體地處理資料:可依序處理大量資料。
- 無限序列:可以利用
itertools.count()這類函式來表示。
總結
- 迭代器是一種可以依序取得下一個值的物件。
- 你可以透過定義
__iter__()和__next__()自訂迭代器。 - 在
for迴圈或使用next()函式時,這些會自動處理。 - 利用生成器或
itertools可以更有效率地進行處理。
透過使用迭代器,你可以以節省記憶體的方式依序處理大量資料,並能靈活管理狀態,提升程式效能。
您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。