DBA隨筆 DBA隨筆 1周前 寫(xiě)python的時(shí)候,大多數(shù)場(chǎng)景下,我都是if else選手,因?yàn)樽詈诵牡倪壿嫀缀醵际峭ㄟ^(guò)if else語(yǔ)句來(lái)實(shí)現(xiàn)的。關(guān)于匿名函數(shù)這塊兒,其實(shí)可以用常見(jiàn)的循環(huán)等方法來(lái)實(shí)現(xiàn),但是如果你想成為一個(gè)python的高手,匿名函數(shù)還是必須要了解的。因?yàn)槟涿瘮?shù),能夠讓你的代碼足夠簡(jiǎn)潔, 在python中,匿名函數(shù),顧名思義,就是沒(méi)有名字的函數(shù),它主要用在那些只使用一次的場(chǎng)景中。如果我們的程序中只需要調(diào)用一次某個(gè)簡(jiǎn)單邏輯,把它寫(xiě)成函數(shù)還需要先定義、取函數(shù)名字等一些列操作,這種場(chǎng)景下使用匿名函數(shù)往往能夠讓你的程序更加簡(jiǎn)單。 匿名函數(shù)還有名稱,叫做lambda。匿名函數(shù)格式如下: lambda arg1,arg2 ...,argN : expression 它常用格式是lambda關(guān)鍵字+逗號(hào)分隔的參數(shù)+冒號(hào)+表達(dá)式。 簡(jiǎn)單看個(gè)例子吧:
利用lambda,我們實(shí)現(xiàn)對(duì)一個(gè)數(shù)字x求平方的運(yùn)算,在python中,**代表乘方操作。 上面的例子中,x就是參數(shù),冒號(hào)后面的x**2就是expression表達(dá)式。 當(dāng)然,我們也可以定義一個(gè)函數(shù)來(lái)實(shí)現(xiàn)乘方操作。 lambda區(qū)別于函數(shù)的一點(diǎn)在于,lambda是一個(gè)表達(dá)式,它不是一個(gè)函數(shù),也不是一個(gè)語(yǔ)句。因此,lambda可以被用在一些特殊的地方,例如下面的場(chǎng)景: 我們可以用range函數(shù)來(lái)生成一個(gè)list,如下:
如果我們要對(duì)這些數(shù)字做乘方操作,則可以直接寫(xiě)成下面的樣子:
當(dāng)然,你也可以利用函數(shù),使用另外的方法來(lái)實(shí)現(xiàn)這個(gè)過(guò)程如下:
相比于前面的lambda函數(shù),這個(gè)方法顯得不那么靈巧。 所謂的函數(shù)式編程,代表代碼中每塊都是不可變的,都是由函數(shù)構(gòu)成的,函數(shù)本身相互獨(dú)立,互不影響,相同的輸入都對(duì)應(yīng)相同的輸出,函數(shù)式編程特性,和lambda有密切的關(guān)系。 來(lái)看下面的例子,假如我們想讓一個(gè)list中的元素都乘以2,可以寫(xiě)成下面的形式:
上面這段代碼,就不是一個(gè)函數(shù)式編程的例子。 因?yàn)槊看屋斎肓斜鞮,L的值都會(huì)被改變,如果我們多次調(diào)用double_num這個(gè)函數(shù),每次的結(jié)果都不一樣。 那么如果我們讓它變成一個(gè)函數(shù)式編程,就得寫(xiě)成下面這樣:
在python中,提供了常用的幾個(gè)函數(shù)map、filter、reduce同lambda一起使用,來(lái)實(shí)現(xiàn)函數(shù)式編程(注意,這3個(gè)函數(shù)需要在python3的環(huán)境下使用)。 map函數(shù) map(function, list) 注意,這里的function可以是匿名函數(shù),也可以是普通的函數(shù)。 還是上面的乘以2的例子,假如我們使用map函數(shù)配合lambda來(lái)實(shí)現(xiàn),可以寫(xiě)成下面這樣:
這里的lambda就可以用函數(shù)來(lái)替換,如下:
filter函數(shù) filter(function,list) filter函數(shù)主要用來(lái)對(duì)可迭代的對(duì)象中的每個(gè)元素,都用function判斷,將返回true的對(duì)象返回,返回false的對(duì)象拋棄,如下為判斷一個(gè)集合中的偶數(shù):
reduce函數(shù) reduce(function, list) reduce主要用來(lái)對(duì)一個(gè)列表做一些累計(jì)操作,假如我們要計(jì)算某個(gè)列表的累計(jì)乘積,可以用下面的方法:
下面是一個(gè)例子,測(cè)試不同的方案下,使用lambda、for循環(huán)和新建list的方法,分別對(duì)一個(gè)集合元素乘以2,計(jì)算的耗時(shí)情況:
可以看到,使用map+lambda計(jì)算的時(shí)候,性能是更好的。map函數(shù)是由c語(yǔ)言寫(xiě)的,運(yùn)行的時(shí)候不需要通過(guò)python解釋器,并且內(nèi)部做了很多優(yōu)化,因此性能會(huì)更好。 更多l(xiāng)ambda細(xì)節(jié)請(qǐng)關(guān)注python3的官方文檔。今天就到這里吧。 |
|
來(lái)自: 風(fēng)聲之家 > 《python》