來源于https://blog.csdn.net/youzhouliu/article/details/78948140
簡單來說指煎,編程中提到的 lambda 表達式秉犹,通常是在需要一個函數(shù)镜廉,但是又不想費神去命名一個函數(shù)的場合下使用奠宜,也就是指匿名函數(shù)扇住。其一般有如下幾種使用方式:
1盈厘、lambda的一般形式是關(guān)鍵字lambda后面跟一個或多個參數(shù)睁枕,緊跟一個冒號,以后是一個表達式沸手。lambda是一個表達式而不是一個語句外遇。它能夠出現(xiàn)在Python語法不允許def出現(xiàn)的地方。作為表達式契吉,lambda返回一個值(即一個新的函數(shù))跳仿。lambda用來編寫簡單的函數(shù),而def用來處理更強大的任務(wù)捐晶。例如:
f = lambda x,y,z : x+y+z
print f(1,2,3)
g = lambda x,y=2,z=3 : x+y+z
print g(1,z=4,y=5)
結(jié)果:
6
10
2菲语、lambda表達式常用來編寫跳轉(zhuǎn)表(jump table)妄辩,就是行為的列表或字典。例如:
L = [(lambda x: x**2),
(lambda x: x**3),
(lambda x: x**4)]
print L[0](2),L[1](2),L[2](2)
D = {'f1':(lambda: 2+3),
'f2':(lambda: 2*3),
'f3':(lambda: 2**3)}
print D['f1'](),D['f2'](),D['f3']()
結(jié)果:
4 8 16
5 6 8
3山上、lambda表達式可以嵌套使用眼耀,但是從可讀性的角度來說,應(yīng)盡量避免使用嵌套的lambda表達式佩憾。
Lambda函數(shù)又稱匿名函數(shù)哮伟,匿名函數(shù)就是沒有名字的函數(shù),函數(shù)沒有名字也行妄帘?當(dāng)然可以啦楞黄。有些函數(shù)如果只是臨時一用,而且它的業(yè)務(wù)邏輯也很簡單時抡驼,就沒必要非給它取個名字不可鬼廓。lamdba函數(shù)的正確使用場景:
1、函數(shù)式編程
盡管Python算不上是一門純函數(shù)式編程語言致盟,但它本身提供了很多函數(shù)式編程的特性碎税,Python中,也有幾個定義好的全局函數(shù)方便使用的勾邦,像map蚣录、reduce、filter眷篇、sorted這些函數(shù)都支持函數(shù)作為參數(shù)萎河,lambda函數(shù)就可以應(yīng)用在函數(shù)式編程中。如下:
from functools import reduce
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print (list(filter(lambda x: x % 3 == 0, foo)))
#[18, 9, 24, 12, 27]
print (list(map(lambda x: x * 2 + 10, foo)))
#[14, 46, 28, 54, 44, 58, 26, 34, 64]
print (reduce(lambda x, y: x + y, foo))
#139
2蕉饼、閉包
閉包本身是一個晦澀難懂的概念虐杯,在這里我們以簡單粗暴地理解為閉包就是一個定義在函數(shù)內(nèi)部的函數(shù),閉包使得變量即使脫離了該函數(shù)的作用域范圍也依然能被訪問到昧港。lambda函數(shù)作為閉包的例子:
>>> def my_add(n):
... return lambda x:x+n
>>> add_3 = my_add(3)
>>> add_3(7)
10
這里lambda函數(shù)就是一個閉包擎椰,在全局作用域范圍中,add_3(7)可以正常執(zhí)行且返回值為10创肥,之所以返回10是因為在my_add局部作用域中达舒,變量n的值在閉包的作用使得它在全局作用域也可以被訪問到。
換成常規(guī)函數(shù)也可以實現(xiàn)閉包叹侄,只不過是這種方式稍顯啰嗦巩搏,如下:
>>> def my_add(n):
... def wrapper(x):
... return x+n
... return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7
不過不是任何情況lambda函數(shù)都要比常規(guī)函數(shù)更清晰明了,看這個例子:
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
這是返回某個集合的所有子集的lambda函數(shù)趾代,相信你要看一會兒才能看明白贯底。
python中有這樣一句話是Explicit is better than implicit(明了勝于晦澀)。若用lambda函數(shù)不能使代碼變得更清晰撒强,就要考慮使用常規(guī)的方式來定義函數(shù)禽捆。