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

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

練習題 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 函數,確認非字串的情況不受影響。
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在 Python 中,生成器與裝飾器是兩個非常強大的特性,分別讓我們能更高效地處理數據流和更靈活地擴展函數的功能。
這篇文章是在解說上一篇文章:[Python教學] 進階:函數式程式設計 的課後練習的題目的解答,如果還沒看過上一篇文章的話建議可以先行前往閱讀!
在這篇文章中,我們將深入介紹 Python 中的高階函數、匿名函數(lambda)、以及一些常用的高階函數工具如 map()、filter()、reduce()。這些概念和工具讓程式碼更加精簡並具有較高的可讀性和靈活性,是編寫 Python 程式碼的重要技巧。
在這篇文章中,我們將介紹如何在 Python 中進行除錯與測試。初學者可以利用 print() 進行簡單除錯,進階則可以學習 logging 模組進行更詳細的記錄,並利用 unittest 和 pytest 等單元測試工具進行自動化測試,以確保程式的穩定性。
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
在 Python 中,生成器與裝飾器是兩個非常強大的特性,分別讓我們能更高效地處理數據流和更靈活地擴展函數的功能。
這篇文章是在解說上一篇文章:[Python教學] 進階:函數式程式設計 的課後練習的題目的解答,如果還沒看過上一篇文章的話建議可以先行前往閱讀!
在這篇文章中,我們將深入介紹 Python 中的高階函數、匿名函數(lambda)、以及一些常用的高階函數工具如 map()、filter()、reduce()。這些概念和工具讓程式碼更加精簡並具有較高的可讀性和靈活性,是編寫 Python 程式碼的重要技巧。
在這篇文章中,我們將介紹如何在 Python 中進行除錯與測試。初學者可以利用 print() 進行簡單除錯,進階則可以學習 logging 模組進行更詳細的記錄,並利用 unittest 和 pytest 等單元測試工具進行自動化測試,以確保程式的穩定性。
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。