更新於 2024/11/16閱讀時間約 10 分鐘

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

在這篇文章中,我們將深入介紹 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 程式更具表現力。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.