匿名函式 lambda
lambda 函式是「只有一行」的函式,可以用來處理一些小型函式,就可以不用為了一小段程式碼,額外新增一個有名稱的函式,這篇教學將會介紹 Python 的匿名函式。
快速導覽:匿名函式的特性、使用匿名函式、使用多個參數、搭配 for 迴圈、搭配 if 判斷式、搭配 map 方法、搭配 filter 方法、搭配 sorted 方法
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
匿名函式的特性
lambda 匿名函式具有下列幾種特性:
- 匿名函式不需要定義名稱,一般函式需定義名稱。
- 匿名函式只能有一行運算式,一般函式可以有多行運算式。
- 匿名函式執行完成後自動回傳結果,一般函式加上 return 關鍵字才能回傳結果。
使用匿名函式 lambda
lambda 函式的使用方法為「lambda 名稱: 內容
」,下方的程式裡,lambda 函式執行的結果等同於 hello 函式。
def hello(title):
print(title)
hello('oxxo') # oxxo
(lambda title: print(title))('oxxo') # oxxo
使用多個參數
lambda 函式可以支援參數,使用時「不需要用小括號」包住參數,如果有多個參數時,使用「逗號」分隔每個參數,此外,如果函式裡會有回傳值,在 lambda 函式裡不需要撰寫 return 語法,計算完畢就會將值回傳。
下方的程式裡,lambda 函式執行的結果等同於 hello 函式,會計算出 x+y 的數值。
def hello(x, y):
return x+y
a = hello(1,2)
b = (lambda x, y: x+y)(1,2)
print(a) # 3
print(b) # 3
lambda 函式可以給予一個變數作為名稱 ( function name ),使用時就像是呼叫函式的用法,但仍然要注意 lambda 函式只能撰寫「一行程式」,所以只適用於比較小型的程式。
下方的程式裡,lambda 函式 b 執行的結果等同於 a 函式,會計算出 x+y 的數值。
def a(x, y):
return x+y
b = lambda x, y: x+y
print(a(1,2)) # 3
print(b(1,2)) # 3
搭配 for 迴圈
下方的程式將 lambda 函式 y 與 for 迴圈搭配 ( 參考 for 迴圈 ),效果等同於 x 函式。
def x(n):
a = list(range(n))
return a
y = lambda n: [i for i in range(n)] # 計算後回傳串列結果
print(x(5)) # [0, 1, 2, 3, 4]
print(y(5)) # [0, 1, 2, 3, 4]
搭配 if 判斷式
下方的程式將 lambda 函式 y 與 if 判斷式搭配 ( 參考 邏輯判斷 ( if、elif、else ) ),效果等同於 x 函式。
def y(n):
if n<10:
return True
else:
return False
x = lambda n: True if n<10 else False # 判斷是否小於 10,回傳 True 或 False
print(x(5)) # True
print(y(5)) # True
搭配 map 方法
下方的程式將 lambda 函式 map 方法搭配,產生一個新的 b 串列,b 串列的項目是 a 串列項目的平方。( 參考:map )
a = [1,2,3,4,5,6,7,8,9]
b = map(lambda x: x*x, a)
print(list(b)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
搭配 filter 方法
下方的程式將 lambda 函式 filter 方法搭配,filter 方法會將 True 的項目留下,所以新串列的項目都會是大於 5 的數字。( 參考:filter )
a = [1,2,3,4,5,6,7,8,9]
b = filter(lambda x: x>5, a)
print(list(b)) # [6, 7, 8, 9]
搭配 sorted 方法
下方的程式將 lambda 函式 sorted 方法搭配,當 sorted 方法設定 key 參數時,會根據 key 進行排序,所以會根據陣列中第二個項目的大小進行排序。( 參考:sorted )
a = [[1,2],[4,3],[5,1],[9,2],[3,7]]
b = sorted(a, key = lambda x: x[1])
print(list(b)) # [[5, 1], [1, 2], [9, 2], [4, 3], [3, 7]]
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~