以下內(nèi)容主要針過(guò)濾函數(shù)filter , 映射和歸并函數(shù)map/reduce , 裝飾器@ 以及 匿名函數(shù)lamda,具體內(nèi)容如下:
1. 過(guò)濾函數(shù)filter
定義:filter 函數(shù)的功能相當(dāng)于過(guò)濾器。調(diào)用一個(gè)布爾函數(shù)bool_func來(lái)迭代遍歷每個(gè)列表中的元素;返回一個(gè)使bool_func返回值為true的元素的序列。
回到頂部
2. 映射和歸并函數(shù)map/reduce
這里說(shuō)的map和reduce是Python的內(nèi)置函數(shù),不是Goggle的MapReduce架構(gòu)。
2.1 map函數(shù)
map函數(shù)的格式:map( func, seq1[, seq2...] )
Python函數(shù)式編程中的map()函數(shù)是將func作用于列表中的每一個(gè)元素,并用一個(gè)列表給出返回值。如果func為None,作用等同于一個(gè)zip()函數(shù)。
下圖是當(dāng)列表只有一個(gè)的時(shí)候,map函數(shù)的工作原理圖:

舉個(gè)簡(jiǎn)單的例子:將列表中的元素全部轉(zhuǎn)換為None。
輸出:[None,None,None,None]。
當(dāng)列表有多個(gè)時(shí),map()函數(shù)的工作原理圖:

也就是說(shuō)每個(gè)seq的同一位置的元素在執(zhí)行過(guò)一個(gè)多元的func函數(shù)之后,得到一個(gè)返回值,這些返回值放在一個(gè)結(jié)果列表中。
下面的例子是求兩個(gè)列表對(duì)應(yīng)元素的積,可以想象,這是一種可能會(huì)經(jīng)常出現(xiàn)的狀況,而如果不是用map的話,就要使用一個(gè)for循環(huán),依次對(duì)每個(gè)位置執(zhí)行該函數(shù)。
2.2 reduce函數(shù)
reduce函數(shù)格式:reduce(func, seq[, init]).
reduce函數(shù)即為化簡(jiǎn),它是這樣一個(gè)過(guò)程:每次迭代,將上一次的迭代結(jié)果(第一次時(shí)為init的元素,如沒(méi)有init則為seq的第一個(gè)元素)與下一個(gè)元素一同執(zhí)行一個(gè)二元的func函數(shù)。在reduce函數(shù)中,init是可選的,如果使用,則作為第一次迭代的第一個(gè)元素使用。
簡(jiǎn)單來(lái)說(shuō),可以用這樣一個(gè)形象化的式子來(lái)說(shuō)明:
reduce函數(shù)的工作原理圖如下所示:

舉個(gè)例子來(lái)說(shuō),階乘是一個(gè)常見(jiàn)的數(shù)學(xué)方法,Python中并沒(méi)有給出一個(gè)階乘的內(nèi)建函數(shù),我們可以使用reduce實(shí)現(xiàn)一個(gè)階乘的代碼。
回到頂部
3. 裝飾器@
3.1 什么是裝飾器(函數(shù))?
定義:裝飾器就是一函數(shù),用來(lái)包裝函數(shù)的函數(shù),用來(lái)修飾原函數(shù),將其重新賦值給原來(lái)的標(biāo)識(shí)符,并永久的喪失原函數(shù)的引用。
3.2 裝飾器的用法
先舉一個(gè)簡(jiǎn)單的裝飾器的例子:
# 定義一個(gè)計(jì)時(shí)器,傳入一個(gè),并返回另一個(gè)附加了計(jì)時(shí)功能的方法
# 定義一個(gè)內(nèi)嵌的包裝函數(shù),給傳入的函數(shù)加上計(jì)時(shí)功能的包裝
# 將包裝后的函數(shù)返回
輸出:
python中專門為裝飾器提供了一個(gè)@符號(hào)的語(yǔ)法糖,用來(lái)簡(jiǎn)化上面的代碼,他們的作用一樣。上述的代碼還可以寫成這樣(裝飾器專有的寫法,注意符號(hào)“@”):
# 定義一個(gè)計(jì)時(shí)器,傳入一個(gè),并返回另一個(gè)附加了計(jì)時(shí)功能的方法
# 定義一個(gè)內(nèi)嵌的包裝函數(shù),給傳入的函數(shù)加上計(jì)時(shí)功能的包裝
# 將包裝后的函數(shù)返回
其實(shí)對(duì)裝飾器的理解,我們可以根據(jù)它的名字來(lái)進(jìn)行,主要有三點(diǎn):
1)首先裝飾器的特點(diǎn)是,它將函數(shù)名作為輸入(這說(shuō)明裝飾器是一個(gè)高階函數(shù));
2)通過(guò)裝飾器內(nèi)部的語(yǔ)法將原來(lái)的函數(shù)進(jìn)行加工,然后返回;
3)原函數(shù)通過(guò)裝飾器后被賦予新的功能,新函數(shù)覆蓋原函數(shù),以后再調(diào)用原函數(shù),將會(huì)起到新的作用。
說(shuō)白了,裝飾器就相當(dāng)于是一個(gè)函數(shù)加工廠,可以將函數(shù)進(jìn)行再加工,賦予其新的功能。
裝飾器的嵌套:
#!/usr/bin/python# -*- coding: utf-8 -*-def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>" return wrappeddef makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped@makebold@makeitalicdef hello(): return "hello world"print hello()
輸出結(jié)果:
<b><i>hello world</i></b>
為什么是這個(gè)結(jié)果呢?
1)首先hello函數(shù)經(jīng)過(guò)makeitalic 函數(shù)的裝飾,變成了這個(gè)結(jié)果<i>hello world</i>
2)然后再經(jīng)過(guò)makebold函數(shù)的裝飾,變成了<b><i>hello world</i></b>,這個(gè)理解起來(lái)很簡(jiǎn)單。
回到頂部
4. 匿名函數(shù)lamda
4.1 什么是匿名函數(shù)?
在Python,有兩種函數(shù),一種是def定義,一種是lambda函數(shù)。
定義:顧名思義,即沒(méi)有函數(shù)名的函數(shù)。Lambda表達(dá)式是Python中一類特殊的定義函數(shù)的形式,使用它可以定義一個(gè)匿名函數(shù)。與其它語(yǔ)言不同,Python的Lambda表達(dá)式的函數(shù)體只能有唯一的一條語(yǔ)句,也就是返回值表達(dá)式語(yǔ)句。
4.2 匿名函數(shù)的用法
lambda的一般形式是關(guān)鍵字lambda,之后是一個(gè)或者多個(gè)參數(shù),緊跟的是一個(gè)冒號(hào),之后是一個(gè)表達(dá)式:
lambda主體是一個(gè)單一的表達(dá)式,而不是一個(gè)代碼塊。
舉一個(gè)簡(jiǎn)單的例子,假如要求兩個(gè)數(shù)之和,用普通函數(shù)或匿名函數(shù)如下:
1)普通函數(shù): def func(x,y):return x+y
2)匿名函數(shù): lambda x,y: x+y
再舉一例:對(duì)于一個(gè)列表,要求只能包含大于3的元素。
1)常規(guī)方法:
為什么要用匿名函數(shù)?
1) 使用Python寫一些執(zhí)行腳本時(shí),使用lambda可以省去定義函數(shù)的過(guò)程,讓代碼更加精簡(jiǎn)。
2) 對(duì)于一些抽象的,不會(huì)別的地方再?gòu)?fù)用的函數(shù),有時(shí)候給函數(shù)起個(gè)名字也是個(gè)難題,使用lambda不需要考慮命名的問(wèn)題。
3) 使用lambda在某些時(shí)候讓代碼更容易理解。
以上內(nèi)容就是針對(duì)Python中特殊函數(shù)詳細(xì)介紹,希望對(duì)大家有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選