通常來說,lambda起到了一種函數(shù)速寫的作用,允許在使用的代碼內(nèi)嵌入一個(gè)函數(shù)的定義。在你僅需要嵌入小段可執(zhí)行代碼的情況下它們會(huì)帶來一個(gè)更簡潔的代碼結(jié)構(gòu)。
lambda通常用來編寫跳轉(zhuǎn)表(jump table),也就是行為的列表或字典,能夠按照需要執(zhí)行相應(yīng)的動(dòng)作。如下段代碼所示。
L = [lambda x: x ** 2, # Inline function definition
lambda x: x ** 3,
lambda x: x ** 4] # A list of 3 callable functions
for f in L:
print(f(2)) # Prints 4,8,16
print(L[0](3)) # Prints 9
當(dāng)需要把小段的可執(zhí)行代碼編寫進(jìn)def語句從語法上不能編寫進(jìn)的地方時(shí),lambda表達(dá)式作為def的一種速寫來說是最為有用的。例如,上面的代碼片段,通過在列表常量中嵌入lambda表達(dá)式創(chuàng)建一個(gè)含有三個(gè)函數(shù)的列表。對(duì)等的def代碼可能需要在想要使用的環(huán)境之外有臨時(shí)性函數(shù)名稱和函數(shù)定義。
def f1(x): return x ** 2
def f2(x): return x ** 3 # Define named functions
def f3(x): return x ** 4
L = [f1,f2,f3] # Reference by name
for f in L:
print(f(2)) # Prints 4,8,16
print(L[0](3)) # Prints 9
實(shí)際上,我們可以用Python中的字典或者其他的數(shù)據(jù)結(jié)構(gòu)來構(gòu)建更多種類的行為表,從而做同樣的事情。下面給出另一個(gè)例子:
key = 'got'
{'already': (lambda: 2 + 2),
...'got': (lambda: 2 * 4),
...'one': (lambda: 2 ** 6)}[key]
name
for f in L:
print(f(2)) # Prints 4,8,16
print(L[0](3)) # Prints 9
這里,當(dāng)Python創(chuàng)建這個(gè)字典的時(shí)候,每個(gè)嵌套的lambda都生成并留下了一個(gè)在之后能夠調(diào)用的函數(shù)。如果不是用lambda做這種工作,需要使用三個(gè)文件中其他地方出現(xiàn)過的def語句來替代,也就是在這些函數(shù)將會(huì)使用的那個(gè)字典外的某處需要定義這些函數(shù)。
def f1(): return 2 + 2...
def f2(): return 2 * 4
...
def f3(): return 2 ** 6
...
key = 'one'
{'already': f1,'got': f2,'one': f3}[key]()
64
同樣,上面代碼會(huì)實(shí)現(xiàn)相同的功能,但是def也許會(huì)出現(xiàn)在文件中的任意位置,即使它們只有很少的代碼。類似剛才lambda的代碼,提供了一種特別有用的可以在單個(gè)情況出現(xiàn)的函數(shù):如果這里的三個(gè)函數(shù)不會(huì)在其他的地方使用到,那么將它們的定義作為lambda嵌入在字典中就是很合理的了。不僅如此,def格式要求為這些小函數(shù)創(chuàng)建變量名,這些變量名也許會(huì)與這個(gè)文件中的其他變量名發(fā)生沖突。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62629 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68625 -
Lambda
+關(guān)注
關(guān)注
0文章
29瀏覽量
9879
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論