在這篇文章中,我們將深入介紹 Python 中的高階函數、匿名函數(lambda
)、以及一些常用的高階函數工具如 map()
、filter()
、reduce()
。這些概念和工具讓程式碼更加精簡並具有較高的可讀性和靈活性,是編寫 Python 程式碼的重要技巧。
高階函數是可以接收另一個函數作為參數,或者返回函數的函數。在 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
接收兩個數值和一個函數,並使用該函數來操作數值。
高階函數常見的應用場景包括如排序時的自定義鍵函數 key
,map()
、filter()
等高階函數的使用。
匿名函數,或稱 lambda
函數,是一種不需要名字的函數,適合於需要簡短使用的場景。lambda
函數能夠使用 lambda
關鍵字快速創建。
語法
lambda arguments: expression
arguments
:輸入參數expression
:返回值或表達式範例:使用 lambda
函數
# 將兩數相加的 lambda 函數
add = lambda x, y: x + y
print(add(5, 10)) # 輸出 15
在 lambda
函數中,我們可以直接寫出簡短的表達式,而不需要像傳統函數那樣使用 def
。lambda
函數在高階函數如 map()
、filter()
中非常常見,適合處理單行的計算。
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
函數將每個數字平方,並將結果轉換為列表輸出。
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
運行,只保留偶數。
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
函數計算列表的乘積。
我們來看一個範例,結合使用 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()
來求總和。這樣的寫法使得程式碼簡潔並具有良好的可讀性。
寫一個高階函數 apply_operation
,它接受兩個整數和一個函數作為參數,並返回應用該函數後的結果。例如,apply_operation(4, 5, lambda x, y: x + y)
應返回 9
。
定義一個列表 words
,裡面包含多個字串。使用 filter()
和 lambda
函數,篩選出字串長度大於 5 的單詞,並將結果儲存為新列表。
例如:words = ["apple", "banana", "grape", "cherry", "strawberry"]
,結果應為 ["banana", "strawberry"]
。
給定一個整數列表 numbers
,使用 map()
和 lambda
函數將所有數字平方,並將結果存儲為新列表。
例如:numbers = [2, 3, 4]
,結果應為 [4, 9, 16]
。
使用 filter()
和 reduce()
計算列表中所有偶數的總和。
例如:numbers = [1, 2, 3, 4, 5, 6]
,結果應為 12
。
給定一個包含正整數的列表,找出所有可以被 3 整除的數字,將它們的立方(次方 3)計算出來,最後使用 reduce()
將這些數字的總和求出。
例如:numbers = [3, 5, 6, 9, 12]
,結果應為 1536
(即 33+63+93+1233^3 + 6^3 + 9^3 + 12^333+63+93+123)。
寫一個函數 capitalize_and_filter
,將包含多個字串的列表中的每個字串首字母轉成大寫,然後篩選掉所有包含 "a" 的字串。
例如:words = ["apple", "banana", "grape", "cherry", "blueberry"]
,結果應為 ["Grape", "Cherry"]
。
寫一個函數 int_to_string_with_filter
,接受一個整數列表,將每個偶數轉換為字串,然後將它們儲存在新列表中。例如,int_to_string_with_filter([1, 2, 3, 4, 5, 6])
的輸出應為 ["2", "4", "6"]
。
使用 map()
與 reduce()
來計算一組字串列表中所有字串長度的總和。例如,words = ["apple", "banana", "grape"]
,應返回 16
。
lambda
) 適合簡短、臨時的運算,在高階函數中經常搭配使用。map()
、filter()
和 reduce()
使得對列表和集合的處理更加靈活,適合各種資料處理需求。透過這些工具,我們能夠更有效地進行數據處理,將程式碼簡化並提高可讀性。掌握這些概念後,可以在日常開發中應用,使得 Python 程式更具表現力。