更新於 2024/12/04閱讀時間約 4 分鐘

[Python教學] 進階:生成器與裝飾器-課後練習詳解

練習題 1:生成器練習

題目: 編寫一個生成器函數 fibonacci(n),生成前 n 個 Fibonacci 數。

解法與解析:

Fibonacci 數列是一個數字序列,其中每個數字是前兩個數字的總和,定義如下:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) (n >= 2)

我們可以使用生成器按需生成 Fibonacci 數列,並且只需保存當前的兩個數字,極大地節省了內存。

程式碼:

def fibonacci(n):
"""生成前 n 個 Fibonacci 數"""
a, b = 0, 1 # 初始化前兩個數字
for _ in range(n):
yield a # 返回當前數字
a, b = b, a + b # 更新數字

# 測試
n = 10
print(f"前 {n} 個 Fibonacci 數:")
for num in fibonacci(n):
print(num, end=" ") # Output: 0 1 1 2 3 5 8 13 21 34

詳解:

  1. 使用 yield 每次返回當前的 Fibonacci 數字。
  2. 每次迭代更新 ab,分別代表當前數字和下一個數字。
  3. 只使用兩個變數,節省記憶體。

練習題 2:裝飾器練習

題目: 編寫一個裝飾器 capitalize_return,將原函數的返回值(字串)轉為大寫。

解法與解析:

裝飾器是一個高階函數,接受函數作為參數並返回一個新的函數。在這裡,我們將包裝原函數,使其返回值經過處理後再返回。

程式碼:

def capitalize_return(func):
"""將函數返回值轉為大寫"""
def wrapper(*args, **kwargs):
result = func(*args, **kwargs) # 執行原始函數
if isinstance(result, str): # 確保返回值是字串
return result.upper() # 轉為大寫
return result # 如果不是字串,直接返回原結果
return wrapper

# 測試函數
@capitalize_return
def greet(name):
return f"Hello, {name}!"

@capitalize_return
def add(x, y):
return x + y # 測試非字串的情況

# 測試
print(greet("Alice")) # Output: "HELLO, ALICE!"
print(add(2, 3)) # Output: 5

詳解:

  1. 包裝函數:
    • 裝飾器使用內部函數 wrapper 包裝原函數。
    • 接受 *args**kwargs,確保適配各種函數簽名。
  2. 處理返回值:
    • 如果返回值是字串,將其轉為大寫。
    • 如果返回值不是字串(例如數字),直接返回原值。
  3. 測試用例:
    • 測試 greet 函數,返回字串並轉換。
    • 測試 add 函數,確認非字串的情況不受影響。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.