# 重複結構(repetition structure) by : R緯 ### 在 Python 中,迴圈、迭代、遍歷和遞迴是四個重要的「重複」概念。 ## 1. 迴圈 (Loop) - **定義**:迴圈是一種控制結構,允許你重複執行一段程式碼。Python 中最常見的迴圈有 `for` 迴圈和 `while` 迴圈。 - **用途**:用於重複執行某些操作,直到滿足特定條件。 - **示例**: ```python for i in range(5): # 使用 for 迴圈 print(i) # 輸出 0 到 4 ``` ## 2. 迭代 (Iteration) Python 中,迭代是一種對序列中的元素進行訪問和處理的過程。每次訪問一個元素,稱為一次迭代。迭代可以使用 for 迴圈、while 迴圈等方式實現。 **迭代的語法** ```python for 變數 in 序列: # 處理元素的程式碼 ``` 在這個語法中,`變數` 是用來存放每個元素的變數,`序列` 是要迭代的序列。 **迭代的例子** ```python 水果 = ['蘋果', '香蕉', '櫻桃'] for 水果名稱 in 水果: print(水果名稱) ``` 在這個例子中,我們對水果列表進行迭代,訪問每個元素並將它印出。 **迭代的優點** * 可以對序列中的元素進行訪問和處理。 * 可以使用 for 迴圈、while 迴圈等方式實現。 * 可以對大型序列進行迭代。 **迭代的應用** * 對列表、元組、字串等序列中的元素進行訪問和處理。 * 對數據庫中的資料進行訪問和處理。 * 對文件中的資料進行訪問和處理。 ## 3. 遍歷 (Traversal) **遍歷的基本概念** 在 Python 中,遍歷是一種對數據結構中的元素進行訪問和處理的過程。每次訪問一個元素,稱為一次遍歷。遍歷可以是深度優先(depth-first)或廣度優先(breadth-first)的。 **遍歷的語法** ```python def 遍歷函數(數據結構, 節點): # 處理節點的程式碼 for 子節點 in 數據結構[節點]: 遍歷函數(數據結構, 子節點) ``` 在這個語法中,`遍歷函數` 是用來遍歷數據結構的函數,`數據結構` 是要遍歷的數據結構,`節點` 是要訪問的節點。 **遍歷的例子** ```python 樹 = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } def 遍歷樹(樹, 節點): print(節點) for 子節點 in 樹[節點]: 遍歷樹(樹, 子節點) 遍歷樹(樹, 'A') ``` 在這個例子中,我們對樹進行遍歷,訪問每個節點並將它印出。 **遍歷的優點** * 可以對數據結構中的元素進行訪問和處理。 * 可以使用遞迴函數或堆疊實現。 * 可以對大型數據結構進行遍歷。 **遍歷的應用** * 對樹、圖等數據結構中的元素進行訪問和處理。 * 對文件系統中的檔案進行訪問和處理。 * 對網路中的節點進行訪問和處理。 **深度優先遍歷** 深度優先遍歷是一種遍歷方式,先訪問節點的子節點,然後再訪問節點本身。 **廣度優先遍歷** 廣度優先遍歷是一種遍歷方式,先訪問節點本身,然後再訪問節點的子節點。 **遍歷的實現** 遍歷可以使用遞迴函數或堆疊實現。遞迴函數是一種函數,呼叫自己來實現遍歷。堆疊是一種資料結構,使用堆疊來實現遍歷。 ## 4. 遞迴 (Recursion) - **定義**:遞迴是一種函數調用自身的技術。當函數需要解決一個問題時,它可以將問題分解為更小的子問題,然後調用自身來解決這些子問題。 - **用途**:用於解決可以被分解為相似子問題的問題,如計算階乘、斐波那契數列等。 - **示例**: ```python def factorial(n): if n == 0: # 基本情況 return 1 else: return n * factorial(n - 1) # 遞迴調用 print(factorial(5)) # 輸出 120 ``` # 迭代器(Iterator) Python 迭代器是一個用於遍歷可迭代物件(如列表、元組、字典等)的工具。它允許你一次訪問一個元素,而不需要知道物件的結構或索引。 在 Python 中,任何實現了 `__iter__()` 和 `__next__()` 方法的物件都可以被視為一個迭代器。`__iter__()` 方法返回迭代器物件本身,而 `__next__()` 方法返回下一個元素,如果沒有更多元素,則引發 `StopIteration` 例外。 以下是一個簡單的例子: ```python my_list = [1, 2, 3, 4, 5] my_iter = iter(my_list) print(next(my_iter)) # 輸出: 1 print(next(my_iter)) # 輸出: 2 print(next(my_iter)) # 輸出: 3 print(next(my_iter)) # 輸出: 4 print(next(my_iter)) # 輸出: 5 ``` 在這個例子中,`my_list` 是一個可迭代物件,`my_iter` 是一個迭代器物件。通過 `next()` 函數,可以訪問 `my_list` 中的每個元素。 Python 迭代器的優點包括: * 可以節省內存:迭代器只需要存儲當前元素的索引,而不需要存儲所有元素。 * 可以提高效率:迭代器可以避免不必要的計算和訪問。 * 可以實現懶加載:迭代器可以在需要時才計算下一個元素。 Python 迭代器的應用包括: * 遍歷列表、元組、字典等可迭代物件。 * 實現生成器和協程。 * 實現懶加載和延遲計算。 以下是一個使用迭代器的實際例子: ```python def fibonacci(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b for num in fibonacci(10): print(num) ``` 在這個例子中,`fibonacci()` 函數是一個生成器,它使用迭代器返回斐波那契數列的前 10 個元素。 ## 補充:迭代協議(Iterator Protocol) 迭代協議是一個規範,定義了如何實現迭代器和可迭代物件。 迭代協議由兩個部分組成: 1. `__iter__()`: 這個方法返回迭代器物件本身。它被用於初始化迭代過程。 2. `__next__()`: 這個方法返回下一個元素。如果沒有更多元素,則引發 `StopIteration` 例外。 任何實現了這兩個方法的物件都可以被視為一個迭代器。 以下是一個簡單的例子: ```python class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.data): result = self.data[self.index] self.index += 1 return result else: raise StopIteration my_iter = MyIterator([1, 2, 3, 4, 5]) for num in my_iter: print(num) ``` 在這個例子中,`MyIterator` 類實現了迭代協議。它有 `__iter__()` 和 `__next__()` 方法,分別返回迭代器物件本身和下一個元素。 Python 的可迭代物件(如列表、元組、字典等)也實現了迭代協議。這使得你可以使用迭代器遍歷這些物件。 以下是一個簡單的例子: ```python my_list = [1, 2, 3, 4, 5] my_iter = iter(my_list) for num in my_iter: print(num) ``` 在這個例子中,`my_list` 是一個可迭代物件,`my_iter` 是一個迭代器物件。通過 `iter()` 函數,可以返回 `my_list` 的迭代器物件。然後,可以使用迭代器遍歷 `my_list` 中的元素。 # `map()`函式 ### 語法 ```python map(function, iterable, ...) ``` - **function**:要應用於每個元素的函數。 - **iterable**:一個或多個可迭代對象(如列表、元組等)。如果有多個可迭代對象,則函數必須接受相同數量的參數。 ### 返回值 `map()` 返回一個迭代器,你可以使用 `list()` 或 `tuple()` 等函數將其轉換為列表或元組。 ### 使用示例 **多個可迭代對象**: 如果你有多個可迭代對象,可以將它們一起傳遞給 `map()`,函數的參數數量必須與可迭代對象的數量相同: ```python def add(x, y): return x + y numbers1 = [1, 2, 3] numbers2 = [4, 5, 6] result = map(add, numbers1, numbers2) # 將結果轉換為列表 result_list = list(result) print(result_list) # 輸出: [5, 7, 9] ``` ### 總結 - `map()` 函數可以讓你方便地對可迭代對象中的每個元素應用一個函數,並返回一個新的迭代器。