lambda 表達式
lambda 表達式的語法格式如下:
lambda [parameter_list] : 表達式
從上面的語法格式可以看出 lambda 表達式的幾個要點:
- lambda 表達式必須使用 lambda 關鍵字定義。
- 在 lambda 關鍵字之后、冒號左邊的是參數列表,可以沒有參數,也可以有多個參數。如果有多個參數,則需要用逗號隔開,冒號右邊是該 lambda 表達式的返回值。
實際上,lambda 表達式的本質就是匿名的、單行函數體的函數。因此,lambda 表達式可以寫成函數的形式。
例如,對於如下 lambda 表達式:
lambda x , y:x + y
可改寫為如下函數形式:
def add(x, y):
return x+ y
上面定義函數時使用了簡化語法:當函數體只有一行代碼時,可以直接把函數體的代碼放在與函數頭同一行。
總體來說,函數比 lambda 表達式的適應性更強,lambda 表達式只能創建簡單的函數對象(它只適合函數體為單行的情形)。但 lambda 表達式依然有如下兩個用途:
1.對於單行函數,使用 lambda 表達式可以省去定義函數的過程,讓代碼更加簡潔。
2.對於不需要多次復用的函數,使用 lambda 表達式可以在用完之后立即釋放,提高了性能。
map()函數
map() 函數的基本語法格式如下:
map(function, iterable)
其中,function 參數表示要傳入一個函數,其可以是內置函數、自定義函數或者 lambda 匿名函數;iterable 表示一個或多個可迭代對象,可以是列表、字符串等。
map() 函數的功能是對可迭代對象中的每個元素,都調用指定的函數,並返回一個 map 對象。
注意,該函數返回的是一個 map 對象,不能直接輸出,可以通過 for 循環或者 list() 函數來顯示。
【例 1】還是對列表中的每個元素乘以 2。
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x: x * 2, listDemo) print(list(new_list))
結果為: [2, 4, 6, 8, 10]
【例 2】map() 函數可傳入多個可迭代對象作為參數。
listDemo1 = [1, 2, 3, 4, 5] listDemo2 = [3, 4, 5, 6, 7] new_list = map(lambda x,y: x + y, listDemo1,listDemo2) print(list(new_list))
結果為: [4, 6, 8, 10, 12]
注意,由於 map() 函數是直接由用 C 語言寫的,運行時不需要通過 Python 解釋器間接調用,並且內部做了諸多優化,所以相比其他方法,此方法的運行效率最高。
filter()函數
filter()函數的基本語法格式如下:
filter(function, iterable)
此格式中,funcition 參數表示要傳入一個函數,iterable 表示一個可迭代對象。
filter() 函數的功能是對 iterable 中的每個元素,都使用 function 函數判斷,並返回 True 或者 False,最后將返回 True 的元素組成一個新的可遍歷的集合。
【例 3】返回一個列表中的所有偶數。
listDemo = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, listDemo) print(list(new_list))
結果為: [2, 4]
【例 4】filter() 函數可以接受多個可迭代對象。
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x,y: x-y>0,[3,5,6],[1,5,8] ) print(list(new_list))
結果為: [True, False, False]
reduce()函數
reduce() 函數通常用來對一個集合做一些累積操作,其基本語法格式為:
reduce(function, iterable)
其中,function 規定必須是一個包含 2 個參數的函數;iterable 表示可迭代對象。
注意,由於 reduce() 函數在 Python 3.x 中已經被移除,放入了 functools 模塊,因此在使用該函數之前,需先導入 functools 模塊。
【例 5】計算某個列表元素的乘積。
import functools listDemo = [1, 2, 3, 4, 5] product = functools.reduce(lambda x, y: x * y, listDemo) print(product)
結果為: 120
總結
通常來說,當對集合中的元素進行一些操作時,如果操作非常簡單,比如相加、累積這種,那么應該優先考慮使用 map()、filter()、reduce() 實現。另外,在數據量非常多的情況下(比如機器學習的應用),一般更傾向於函數式編程的表示,因為效率更高。
