python doc 4 —— lambda總結

剛開始學習python的時候很多人可能對於lambda函數不瞭解,感覺和def很混亂,下面我來介紹一下lambda函數:

1、lambda簡介

先來看一段代碼示例:

test = lambda x, y: x+y
print(test(2, 3))
print(test('aaa', 'bbbb'))

# output
5
aaabbbb

第一行是lambda聲明,x,y相當於傳入的參數,整個函數會返回x+y的值。lambda作爲一個表達式,定義了一個匿名函數,上例的代碼x,y爲入口參數,x+y爲函數體。在這裏lambda簡化了函數定義的書寫形式。

python允許用lambda關鍵字創造匿名函數。匿名是不需要以標準的方式來聲明,比如說使用 def 語句。(除非賦值給一個局部變量,這樣的對象也不會在任何的名字空間內創建名字,上面的例子中會創建名字。)

作爲函數,它們也能有參數。一個完整的 lambda"語句"代表了一個表達式,這個表達式的定義體必須和聲明放在同一行。語法如下:

lambda[arg1[,arg2,...argN]]:expressionlambda [arg1[, arg2, ... argN]]: expression

參數是可選的,如果使用的參數話,參數通常也是表達式的一部分

2、lambda匿名函數與def區別

lambda 和 def 它兩個的基本用法差不多,參數都是可選,也都會返回對象

如下:

def test1():
	return x+y

test2 = lambda x, y: x+y
print("def的結果")
print(test1(2, 3))
print("lambda的結果")
print(test2(2, 4))
print(test2('aaa', 'bbbb'))

#output
def的結果
5
lambda的結果
6
aaabbbb

不同之處:

lambda可以定義一個匿名函數,而def定義的函數必須有一個名字。這應該是lambda與def兩者最大的區別。

lambda是一個表達式,而不是一個語句(lambda is an expression, not a statement.)因此,lambda能夠出現在Python語法不允許def出現的地方——例如,在一個列表常量中或者函數調用的參數中。

lambda的主體是一個單個的表達式,而不是一個代碼塊。(lambda’s body is a single expression, not a block of statements.),lambda裏面的語句相當於def中return中的代碼一樣。只能是簡單的表達式,所以說lambda的能力小於def,在lambda中只能使用簡單的語法,不能使用if else while return等語句

它的設計理念爲:lambda是一個爲編寫簡單的函數而設計的,而def用來處理更大的任務。(lambda is designed for coding simple functions, and def handles larger tasks.)

3、lambda的使用

爲什麼要使用lambda?

1、lambda函數主要用來寫一些小體量的一次性函數,避免污染環境,同時也能簡化代碼。
2、lambda起到了一種函數速寫的作用,允許在使用的代碼內嵌入一個函數的定義。他們完全是可選的(你總是能夠使用def來替代它們),但是你僅需要嵌入小段可執行代碼的情況下它們會帶來一個更簡潔的代碼結構。

例如:

map( lambda x: x*x, [y for y in range(10)] )

這個寫法要好過

def sq(x):
	return x * x
map(sq, [y for y in range(10)])

3、lambda使用可以加參數也可以不加參數

有參數就如同上面的用法

無參數:

test3 = lambda: 'lambda的使用'
print(test3)

#output
<function <lambda> at 0x7f8237532950>

4、lambda通常用來編寫跳轉表(jump table),也就是行爲的列表或字典,能夠按照需要執行相應的動作。如下段代碼所示。

L = [lambda x: x **2,
	 lambda x: x **3,
	 lambda x: x **4]

for fun in L:
	print(fun(2))
print(L[0](3))

#output
4
8
16
9

總結

主要有以下幾點[1]:
1、lambda只是一個表達式,函數體比def簡單很多
2、lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去
3、lambda函數擁有自己的名字空間,且不能訪問自有參數列表之外或全局名字空間裏的參數
4、 簡單單行代碼或者一次性的函數可以用lambda函數來書寫,可以讓代碼更簡潔。
5、 對於複雜函數或者函數體體量大的函數,最好不要用lambda函數,會增加代碼的閱讀難度,使代碼晦澀難懂。
6、 在非多次調用的函數的情況下,lambda表達式即用既得,提高性能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章