[Python教學] 進階:函數式程式設計

閱讀時間約 10 分鐘

在這篇文章中,我們將深入介紹 Python 中的高階函數、匿名函數(lambda)、以及一些常用的高階函數工具如 map()filter()reduce()。這些概念和工具讓程式碼更加精簡並具有較高的可讀性和靈活性,是編寫 Python 程式碼的重要技巧。


1 高階函數(Higher-Order Functions)

高階函數是可以接收另一個函數作為參數,或者返回函數的函數。在 Python 中,函數是一等公民,因此可以像變數一樣傳遞給其他函數。這樣的特性使得編寫靈活的代碼成為可能。

範例:高階函數

def add(x, y):
return x + y

def operate(a, b, func):
return func(a, b)

result = operate(5, 10, add)
print(result) # 輸出 15

在這個例子中,我們將 add 函數作為參數傳遞給 operate 函數。operate 接收兩個數值和一個函數,並使用該函數來操作數值。

高階函數常見的應用場景包括如排序時的自定義鍵函數 keymap()filter() 等高階函數的使用。


2 匿名函數(Lambda 函數)

匿名函數,或稱 lambda 函數,是一種不需要名字的函數,適合於需要簡短使用的場景。lambda 函數能夠使用 lambda 關鍵字快速創建。

語法

lambda arguments: expression
  • arguments:輸入參數
  • expression:返回值或表達式

範例:使用 lambda 函數

# 將兩數相加的 lambda 函數
add = lambda x, y: x + y
print(add(5, 10)) # 輸出 15

lambda 函數中,我們可以直接寫出簡短的表達式,而不需要像傳統函數那樣使用 deflambda 函數在高階函數如 map()filter() 中非常常見,適合處理單行的計算。


3 map() 函數

map() 是一個高階函數,用於將一個函數應用到一個可迭代物件的每個元素上,並返回一個 map 物件。可以搭配 list()tuple() 來轉換為列表或元組。

語法

map(function, iterable)
  • function:要應用的函數
  • iterable:要處理的可迭代物件

範例:將列表中的每個元素平方

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # 輸出 [1, 4, 9, 16, 25]

在這個範例中,我們使用 lambda 函數將每個數字平方,並將結果轉換為列表輸出。


4 filter() 函數

filter() 函數用於篩選可迭代物件中的元素,並返回符合條件的元素。它會將 function 應用到每個元素,僅保留 True 的元素。

語法

filter(function, iterable)
  • function:用於篩選的函數,應返回布林值
  • iterable:要篩選的可迭代物件

範例:篩選出列表中的偶數

numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 輸出 [2, 4, 6]

在這個範例中,filter() 函數配合 lambda 運行,只保留偶數。


5 reduce() 函數

reduce() 函數來自於 functools 模組,適合在可迭代物件中進行累積操作。reduce() 每次會將兩個元素進行操作,並將結果與下一個元素繼續進行操作,直到可迭代物件結束。

語法

from functools import reduce
reduce(function, iterable)
  • function:接收兩個參數並返回結果的函數
  • iterable:可迭代物件

範例:計算列表中所有元素的乘積

from functools import reduce

numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 輸出 24 (1*2*3*4)

在這個例子中,reduce() 使用 lambda 函數計算列表的乘積。


課後練習

題目1:給定一組整數,找出所有大於 10 的偶數,將其平方,然後求總和。

我們來看一個範例,結合使用 map()filter()reduce() 來處理數據。

from functools import reduce

numbers = [3, 12, 15, 6, 8, 20, 33, 18]

# Step 1: 篩選出大於 10 的偶數
filtered = filter(lambda x: x > 10 and x % 2 == 0, numbers)

# Step 2: 將篩選出的數字平方
squared = map(lambda x: x ** 2, filtered)

# Step 3: 求所有平方後數字的總和
result = reduce(lambda x, y: x + y, squared)

print(result) # 輸出 884 (12^2 + 20^2 + 18^2)

在這個範例中,我們首先使用 filter() 篩選出大於 10 的偶數,然後用 map() 將其平方,最後用 reduce() 來求總和。這樣的寫法使得程式碼簡潔並具有良好的可讀性。


題目2:基本高階函數

寫一個高階函數 apply_operation,它接受兩個整數和一個函數作為參數,並返回應用該函數後的結果。例如,apply_operation(4, 5, lambda x, y: x + y) 應返回 9


題目3:篩選字串

定義一個列表 words,裡面包含多個字串。使用 filter()lambda 函數,篩選出字串長度大於 5 的單詞,並將結果儲存為新列表。
例如:words = ["apple", "banana", "grape", "cherry", "strawberry"],結果應為 ["banana", "strawberry"]


題目4:平方運算

給定一個整數列表 numbers,使用 map()lambda 函數將所有數字平方,並將結果存儲為新列表。
例如:numbers = [2, 3, 4],結果應為 [4, 9, 16]


題目5:偶數總和

使用 filter()reduce() 計算列表中所有偶數的總和。
例如:numbers = [1, 2, 3, 4, 5, 6],結果應為 12


題目6:計算總和

給定一個包含正整數的列表,找出所有可以被 3 整除的數字,將它們的立方(次方 3)計算出來,最後使用 reduce() 將這些數字的總和求出。
例如:numbers = [3, 5, 6, 9, 12],結果應為 1536(即 33+63+93+1233^3 + 6^3 + 9^3 + 12^333+63+93+123)。


題目7:字串處理

寫一個函數 capitalize_and_filter,將包含多個字串的列表中的每個字串首字母轉成大寫,然後篩選掉所有包含 "a" 的字串。
例如:words = ["apple", "banana", "grape", "cherry", "blueberry"],結果應為 ["Grape", "Cherry"]


題目8:數字轉換

寫一個函數 int_to_string_with_filter,接受一個整數列表,將每個偶數轉換為字串,然後將它們儲存在新列表中。例如,int_to_string_with_filter([1, 2, 3, 4, 5, 6]) 的輸出應為 ["2", "4", "6"]


題目9:字串長度總和

使用 map()reduce() 來計算一組字串列表中所有字串長度的總和。例如,words = ["apple", "banana", "grape"],應返回 16


結論

  • 高階函數 提供了將函數作為參數或返回函數的功能,是 Python 編程中的重要工具。
  • 匿名函數(lambda 適合簡短、臨時的運算,在高階函數中經常搭配使用。
  • map()filter()reduce() 使得對列表和集合的處理更加靈活,適合各種資料處理需求。

透過這些工具,我們能夠更有效地進行數據處理,將程式碼簡化並提高可讀性。掌握這些概念後,可以在日常開發中應用,使得 Python 程式更具表現力。

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
發表第一個留言支持創作者!
在這篇文章中,我們將介紹如何在 Python 中進行除錯與測試。初學者可以利用 print() 進行簡單除錯,進階則可以學習 logging 模組進行更詳細的記錄,並利用 unittest 和 pytest 等單元測試工具進行自動化測試,以確保程式的穩定性。
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
Python 的物件導向程式設計 (Object-Oriented Programming, OOP) 是其最強大和靈活的特性之一。通過 OOP 的思想,我們可以組織、抽象並簡化程式碼結構,以達到更好的可維護性和可擴展性。
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
在這篇文章中,我們將介紹如何在 Python 中進行除錯與測試。初學者可以利用 print() 進行簡單除錯,進階則可以學習 logging 模組進行更詳細的記錄,並利用 unittest 和 pytest 等單元測試工具進行自動化測試,以確保程式的穩定性。
Python 模組和套件系統讓我們的程式可以變得更高效且具備更多功能。本篇文章將深入介紹 Python 的模組,包括模組的匯入與使用、Python 的內建模組,以及如何透過 pip 安裝第三方套件,讓您的開發流程更加便利。
Python 中的錯誤處理機制十分靈活,能讓我們捕捉、管理並處理程式中可能出現的各種錯誤和異常情況。本文將深入介紹 Python 中的錯誤處理語法,包括 try-except 結構、raise 用法以及如何自訂例外類別,讓程式更具容錯性和健壯性。
Python 的物件導向程式設計 (Object-Oriented Programming, OOP) 是其最強大和靈活的特性之一。通過 OOP 的思想,我們可以組織、抽象並簡化程式碼結構,以達到更好的可維護性和可擴展性。
Python 是一個功能強大的程式語言,提供了非常直觀的檔案處理方式。無論是處理數據檔案、讀取日誌文件,還是生成報表,檔案讀寫操作都是程式開發中的重要環節。這篇文章將帶你深入了解如何使用 Python 操作檔案,包括讀取和寫入、檔案模式選擇以及上下文管理器的使用。
在這篇教學中,我們將深入介紹 Python 的控制流程,包括 if-else 判斷、for 和 while 迴圈、break 和 continue 語句的使用,以及如何定義函數並進行參數傳遞。這些概念都是撰寫 Python 程式時的基礎知識,掌握它們將幫助你編寫更清晰、有效的程式碼。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。