簡單來說,編程中提到的 lambda 表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。其一般有如下幾種使用方式:
1、lambda的一般形式是關鍵字lambda后面跟一個或多個參數,緊跟一個冒號,以后是一個表達式。lambda是一個表達式而不是一個語句。它能夠出現在Python語法不允許def出現的地方。作為表達式,lambda返回一個值(即一個新的函數)。lambda用來編寫簡單的函數,而def用來處理更強大的任務。例如:
1
2
3
4
|
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 )<br> |
結果:
6
10
2、lambda表達式常用來編寫跳轉表(jump table),就是行為的列表或字典。例如:
1
2
3
4
5
6
7
8
|
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' ]() |
結果:
4 8 16
5 6 8
3、lambda表達式可以嵌套使用,但是從可讀性的角度來說,應盡量避免使用嵌套的lambda表達式。
Lambda函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。lamdba函數的正確使用場景:
1、函數式編程
盡管Python算不上是一門純函數式編程語言,但它本身提供了很多函數式編程的特性,Python中,也有幾個定義好的全局函數方便使用的,像map、reduce、filter、sorted這些函數都支持函數作為參數,lambda函數就可以應用在函數式編程中。如下:
1
2
3
4
5
6
7
8
|
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、閉包
閉包本身是一個晦澀難懂的概念,在這里我們以簡單粗暴地理解為閉包就是一個定義在函數內部的函數,閉包使得變量即使脫離了該函數的作用域范圍也依然能被訪問到。lambda函數作為閉包的例子:
1
2
|
>>> def my_add(n): ... return lambda x:x + n |
1
2
3
|
>>> add_3 = my_add( 3 ) >>> add_3( 7 ) 10 |
這里lambda函數就是一個閉包,在全局作用域范圍中,add_3(7)可以正常執行且返回值為10,之所以返回10是因為在my_add局部作用域中,變量n的值在閉包的作用使得它在全局作用域也可以被訪問到。
換成常規函數也可以實現閉包,只不過是這種方式稍顯啰嗦,如下:
1
2
3
4
5
6
7
8
|
>>> def my_add(n): ... def wrapper(x): ... return x + n ... return wrapper ... >>> add_5 = my_add( 5 ) >>> add_5( 2 ) 7 |
不過不是任何情況lambda函數都要比常規函數更清晰明了,看這個例子:
1
|
f = lambda x: [[y for j, y in enumerate ( set (x)) if (i >> j) & 1 ] for i in range ( 2 * * len ( set (x)))] |
這是返回某個集合的所有子集的lambda函數,相信你要看一會兒才能看明白。
python中有這樣一句話是Explicit is better than implicit(明了勝于晦澀)。若用lambda函數不能使代碼變得更清晰,就要考慮使用常規的方式來定義函數。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/youzhouliu/article/details/78948140