Python的關(guān)鍵字lambad是定義匿名函數(shù)用的....什么是匿名函數(shù)?就是不需函數(shù)名的函數(shù)。和def有什么區(qū)別呢?
- python lambda會(huì)創(chuàng)建一個(gè)函數(shù)對(duì)象,但不會(huì)把這個(gè)函數(shù)對(duì)象賦給一個(gè)標(biāo)識(shí)符,而def則會(huì)把函數(shù)對(duì)象賦值給一個(gè)變量。
- python lambda它只是一個(gè)表達(dá)式,而def則是一個(gè)語(yǔ)句。
先定義一個(gè)普通函數(shù):
>>> def add(x):
return x*2
>>> add(1)
2
>>> add(5)
10
定義一個(gè)普通函數(shù),主要作用就是將傳入的值乘以2并返回?,F(xiàn)在來(lái)改成匿名函數(shù)
>>> lambda x: x*2
<function __main__.<lambda>>
上面的示例,僅僅是定義了一個(gè)匿名函數(shù),語(yǔ)法是lambda 參數(shù) : 操作。
- 示例代碼中參數(shù)是一個(gè),但是參數(shù)可以很多個(gè)
- 操作只有一條。x*2,不需要return會(huì)自己返回
還有一點(diǎn),匿名函數(shù)創(chuàng)建好不會(huì)賦給參數(shù),所以定義了之后需要使用,最好是傳給一個(gè)標(biāo)示符參數(shù),如下:
>>> lam = lambda x: x*x
>>> lam
<function __main__.<lambda>>
>>> lam(10)
100
>>> lam(4)
16
>>> lamadd = lambda x,y:x+y
>>> lamadd(1,2)
3
>>> lamadd(100,99)
199
既然定義必須賦給一個(gè)變量才可以使用,匿名函數(shù)+標(biāo)示符 類似于 def定義的函數(shù),那匿名的存在有什么意義?
既然這里提到 lambda 匿名函數(shù),就必須提及高階函數(shù)
高階函數(shù)
首先明確一點(diǎn),匿名函數(shù)定義傳給一個(gè)變量,變量后面跟上括號(hào)并放入值,就可以得到函數(shù)操作,這就表明變量可以指向函數(shù),這點(diǎn)很重要,理解這點(diǎn)之后,學(xué)習(xí)高階函數(shù)就會(huì)有比較清晰的思路
同樣的先來(lái)個(gè)示例學(xué)習(xí)一下什么叫高階函數(shù):
>>> f2 = lambda x:x*x
>>> def newadd(x,y,f):
return f(x)+f(y)
>>> newadd(1, 2, f2)
5
>>> newadd( 3, 7, f2)
58
定義一個(gè)匿名函數(shù)并賦值給f2,并定義一個(gè)普通函數(shù),參數(shù)是三個(gè),x、y和一個(gè) f 的函數(shù)。
由于前面提及的一個(gè)點(diǎn):變量可以指向函數(shù),所以f = f2 = lambda -> f(x) = f2(2) = 2*2 = 4
高階函數(shù)的理解就是這樣【只可意會(huì)不可言傳】。理解這一點(diǎn)很重要,趁熱繼續(xù)學(xué)習(xí)python的內(nèi)置高階函數(shù)
Python內(nèi)置高階函數(shù)
map函數(shù)
map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù)名,另一個(gè)是可遍歷的對(duì)象【如列表、字符串】,返回一個(gè)map類型。示例代碼如下:
>>> ks1 = [1,2,3,4,5,6,7,8,9]
>>> ku = map(lambda x: x+1, ks1)
>>> type(ku)
map
>>> list(ku)
[2, 3, 4, 5, 6, 7, 8, 9, 10]
示例代碼中,可以直接使用匿名函數(shù),簡(jiǎn)潔明了
【高階函數(shù)未完】
更多Python3教程--傳送門