vocus logo

方格子 vocus

[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 程式更具表現力。

留言
avatar-img
追極光的北極熊|軟體工程師的小天地
16會員
173內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
看更多
你可能也想看
Thumbnail
本章將介紹 C 語言的函式 (Functions),這是將程式碼模組化、提高可讀性與重用性 的關鍵技術。透過函式,我們可以 拆分程式邏輯、減少重複代碼,本章亦透過實作讓讀者學習 參數傳遞、回傳值、遞迴等重要觀念。
Thumbnail
本章將介紹 C 語言的函式 (Functions),這是將程式碼模組化、提高可讀性與重用性 的關鍵技術。透過函式,我們可以 拆分程式邏輯、減少重複代碼,本章亦透過實作讓讀者學習 參數傳遞、回傳值、遞迴等重要觀念。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
本章節將深入探討如何將複雜的布林代數式化簡為更精簡的邏輯表達,以降低電路複雜度、節省硬體資源並提升運算效率。邏輯化簡是數位邏輯設計中最實用且必備的技巧,能幫助你從繁瑣的真值表中提煉出最簡約的邏輯核心。
Thumbnail
本章節將深入探討如何將複雜的布林代數式化簡為更精簡的邏輯表達,以降低電路複雜度、節省硬體資源並提升運算效率。邏輯化簡是數位邏輯設計中最實用且必備的技巧,能幫助你從繁瑣的真值表中提煉出最簡約的邏輯核心。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
Python是一種廣泛使用的程式語言,它有許多內建的模組可以幫助我們進行各種數學運算,其中一個就是math模組,它提供了許多標準的數學函數,例如三角函數、對數函數、指數函數等,在這篇文章中,我們將介紹如何使用math模組。 導入math模組並計算圓周率的值: # 計算圓周率的值 math模組中
Thumbnail
Python是一種廣泛使用的程式語言,它有許多內建的模組可以幫助我們進行各種數學運算,其中一個就是math模組,它提供了許多標準的數學函數,例如三角函數、對數函數、指數函數等,在這篇文章中,我們將介紹如何使用math模組。 導入math模組並計算圓周率的值: # 計算圓周率的值 math模組中
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
Thumbnail
本章節將介紹數位邏輯設計中兩大核心化簡工具:代數演算法 與 卡諾圖。這兩種方法可幫助你從複雜的布林函數中找出最簡邏輯式,進而設計出更有效率、更節省邏輯閘數量的電路。 透過本章的實作與演練,你將具備兩種強大化簡工具的操作能力,能在不同應用情境中選擇最佳解法,提升邏輯設計效率與電路實現能力!
Thumbnail
本章節將介紹數位邏輯設計中兩大核心化簡工具:代數演算法 與 卡諾圖。這兩種方法可幫助你從複雜的布林函數中找出最簡邏輯式,進而設計出更有效率、更節省邏輯閘數量的電路。 透過本章的實作與演練,你將具備兩種強大化簡工具的操作能力,能在不同應用情境中選擇最佳解法,提升邏輯設計效率與電路實現能力!
Thumbnail
本章節會從最基本的函數開始講起,相信很多人對於函數已經有很好的認識,本章透過簡潔有力的講解與圖片展示、公式整理,讓初學者能夠很好的掌握微積分的基礎;也讓已然熟悉的讀者快速複習重點與細節。
Thumbnail
本章節會從最基本的函數開始講起,相信很多人對於函數已經有很好的認識,本章透過簡潔有力的講解與圖片展示、公式整理,讓初學者能夠很好的掌握微積分的基礎;也讓已然熟悉的讀者快速複習重點與細節。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News