【Python 必会技巧】lambda 表达式(匿名函数)及其在内置函数中的应用
lambda 表達(dá)式,又稱匿名函數(shù),即,函數(shù)沒有具體的名稱,常用來表示內(nèi)部?jī)H包含 1 行表達(dá)式的函數(shù)。
使用 lambda 編寫的代碼更加簡(jiǎn)潔緊湊,但是 lambda 函數(shù)支持的功能卻是十分有限的,目前 PEP8 已經(jīng)不建議使用 lambda,而是推薦使用 def 去定義一個(gè)函數(shù),即便如此,作為 Python 程序員,認(rèn)識(shí)和了解該匿名函數(shù)還是有必要的。
- lambda 只是一個(gè)表達(dá)式,函數(shù)體比 def 簡(jiǎn)單很多。
- lambda 的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在 lambda 表達(dá)式中封裝有限的邏輯進(jìn)去。
- lambda 函數(shù)擁有自己的命名空間,且不能訪問自有參數(shù)列表之外或全局命名空間里的參數(shù)。
- 雖然 lambda 函數(shù)看起來只能寫一行,卻不等同于 C 或 C++ 的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時(shí)不占用棧內(nèi)存從而增加運(yùn)行效率。
lambda 的語法:lambda argument(s):expression
lambda 函數(shù)可以有很多個(gè)參數(shù),但是只能有一個(gè)表達(dá)式。lambda 操作符不能有任何聲明,它返回一個(gè)函數(shù)對(duì)象,可以將此函數(shù)對(duì)象賦值給任何變量。
lambda 函數(shù)簡(jiǎn)單示例:
lambda x, y: x * y # 函數(shù)輸入是 x 和 y,輸出是它們的積 x*y lambda:None # 函數(shù)沒有輸入?yún)?shù),輸出是 None >>> a = lambda x: x+1 >>> a(1) 2# 用 def 函數(shù)表示如下:>>> def a(x):return x+1 >>> a(1) 2lambda 函數(shù)與 def 的主要不同點(diǎn):
- lambda 可以立刻傳遞(無需變量),自動(dòng)返回結(jié)果;
- lambda 在內(nèi)部只能包含一行代碼;
- lambda 是一個(gè)為編寫簡(jiǎn)單的函數(shù)而設(shè)計(jì)的,而 def 用來處理更大的任務(wù);
- lambda 可以定義一個(gè)匿名函數(shù),而 def 定義的函數(shù)必須有一個(gè)名字。
lambda 函數(shù)的優(yōu)勢(shì):
- 對(duì)于單行函數(shù),使用 lambda 表達(dá)式可以省去定義函數(shù)的過程,讓代碼更加簡(jiǎn)潔;
- 對(duì)于不需要多次復(fù)用的函數(shù),使用 lambda 表達(dá)式可以在用完之后立即釋放,提高程序執(zhí)行的性能。
lambda 函數(shù)經(jīng)常用于一些內(nèi)置函數(shù)中:
map() 函數(shù):遍歷序列,對(duì)序列中每個(gè)元素進(jìn)行操作,此時(shí) lambda 函數(shù)用于指定對(duì)列表中每一個(gè)元素的共同操作條件。
>>> list1 = [1, 2, 3, 4] >>> list2 = [5, 6, 7 ,8] >>> list3 = map(lambda a, b: a + b, list1, list2) # 將兩個(gè)列表中對(duì)應(yīng)的元素相加 >>> print(list3) <map object at 0x000001EA57C07780> >>> print(list(list3)) [6, 8, 10, 12]filter() 函數(shù):對(duì)于序列中的元素進(jìn)行篩選操作,此時(shí) lambda 函數(shù)用于指定過濾列表元素的條件。
>>> list1 = [1, 2, 3, 4] >>> list2 = filter(lambda a: a > 2, list1) # 篩選出列表中大于 2 的元素 >>> print(list2) <filter object at 0x000001EA57C07898> >>> print(list(list2)) [3, 4]reduce() 函數(shù):對(duì)于序列中所有元素進(jìn)行累積操作,此時(shí) lambda 函數(shù)用于指定列表中兩兩相鄰元素的累積條件。
>>> from functools import reduce >>> list1 = [1, 2, 3, 4] >>> list2 = reduce(lambda a, b: a + b, list1) # 兩兩相鄰元素進(jìn)行相加操作 >>> print(list2) 10 >>> list2 = reduce(lambda a, b: a * b, list1) # 兩兩相鄰元素進(jìn)行相乘操作 >>> print(list2) 24sorted() 函數(shù):對(duì)于序列中的元素進(jìn)行排序操作,此時(shí) lambda 函數(shù)用于指定對(duì)列表中所有元素進(jìn)行排序的條件。
>>> list1 = [1, 2, 3, 4, 5, 6, 7, 8] >>> list2 = sorted(list1, key = lambda a: abs(4-a)) # 將列表元素按照與 4 的距離從小到大進(jìn)行排序 >>> print(list2) [4, 3, 5, 2, 6, 1, 7, 8]其他資料:《不要在Python中編寫 lambda 表達(dá)式了,不建議大家使用它》
總結(jié)
以上是生活随笔為你收集整理的【Python 必会技巧】lambda 表达式(匿名函数)及其在内置函数中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce的shuffle阶段
- 下一篇: 【Python CheckiO 题解】I