通常來說,lambda起到了一種函數速寫的作用,允許在使用的代碼內嵌入一個函數的定義。在你僅需要嵌入小段可執行代碼的情況下它們會帶來一個更簡潔的代碼結構。
lambda通常用來編寫跳轉表(jump table),也就是行為的列表或字典,能夠按照需要執行相應的動作。如下段代碼所示。
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
當需要把小段的可執行代碼編寫進def語句從語法上不能編寫進的地方時,lambda表達式作為def的一種速寫來說是最為有用的。例如,上面的代碼片段,通過在列表常量中嵌入lambda表達式創建一個含有三個函數的列表。對等的def代碼可能需要在想要使用的環境之外有臨時性函數名稱和函數定義。
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
實際上,我們可以用Python中的字典或者其他的數據結構來構建更多種類的行為表,從而做同樣的事情。下面給出另一個例子:
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
這里,當Python創建這個字典的時候,每個嵌套的lambda都生成并留下了一個在之后能夠調用的函數。如果不是用lambda做這種工作,需要使用三個文件中其他地方出現過的def語句來替代,也就是在這些函數將會使用的那個字典外的某處需要定義這些函數。
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
同樣,上面代碼會實現相同的功能,但是def也許會出現在文件中的任意位置,即使它們只有很少的代碼。類似剛才lambda的代碼,提供了一種特別有用的可以在單個情況出現的函數:如果這里的三個函數不會在其他的地方使用到,那么將它們的定義作為lambda嵌入在字典中就是很合理的了。不僅如此,def格式要求為這些小函數創建變量名,這些變量名也許會與這個文件中的其他變量名發生沖突。
-
函數
+關注
關注
3文章
4329瀏覽量
62575 -
代碼
+關注
關注
30文章
4780瀏覽量
68533 -
Lambda
+關注
關注
0文章
28瀏覽量
9872
發布評論請先 登錄
相關推薦
評論