題目: 編寫一個生成器函數 fibonacci(n)
,生成前 n
個 Fibonacci 數。
Fibonacci 數列是一個數字序列,其中每個數字是前兩個數字的總和,定義如下:
我們可以使用生成器按需生成 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
yield
每次返回當前的 Fibonacci 數字。a
和 b
,分別代表當前數字和下一個數字。題目: 編寫一個裝飾器 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
wrapper
包裝原函數。*args
和 **kwargs
,確保適配各種函數簽名。greet
函數,返回字串並轉換。add
函數,確認非字串的情況不受影響。