Python 中的迭代器

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)
  • 它還內建了許多其他函式,例如:cyclerepeatchainislicetee 等。

迭代器的應用場景

疊代器的使用情境包括以下幾種:。

  • 逐行處理檔案:以迭代器方式逐行讀取檔案。
  • 節省記憶體地處理資料:可依序處理大量資料。
  • 無限序列:可以利用 itertools.count() 這類函式來表示。

總結

  • 迭代器是一種可以依序取得下一個值的物件。
  • 你可以透過定義 __iter__()__next__() 自訂迭代器。
  • for 迴圈或使用 next() 函式時,這些會自動處理。
  • 利用生成器或 itertools 可以更有效率地進行處理。

透過使用迭代器,你可以以節省記憶體的方式依序處理大量資料,並能靈活管理狀態,提升程式效能。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video