溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解Python的函數(shù)式編程

發(fā)布時(shí)間:2020-08-25 10:08:15 來源:億速云 閱讀:128 作者:Leah 欄目:編程語言

本篇文章為大家展示了怎么理解Python的函數(shù)式編程,代碼簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此,任意一個(gè)函數(shù),只要輸入是確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒有副作用。函數(shù)式編程的一個(gè)特點(diǎn)就是,允許函數(shù)接收函數(shù)作為參數(shù),也允許把函數(shù)作為返回值返回。Python對(duì)于函數(shù)式編程提供部分支持。由于Python允許使用變量,因此Python不是純函數(shù)式編程語言。

高階函數(shù)

所謂高階函數(shù),就是允許函數(shù)的參數(shù)接收其他函數(shù) 下面介紹幾個(gè)python內(nèi)置的高階函數(shù):

map() map()函數(shù)接收兩個(gè)參數(shù),一個(gè)序列,一個(gè)函數(shù)。 map()的作用就是把傳入的函數(shù)依次作用于序列的元素,然后把結(jié)果作為一個(gè)Iterator返回。

def function(x): 
return x * x 
r = map(function,[1,2,3,4,5]) 
print('map result:',list(r)) 
//運(yùn)行結(jié)果: 
//map result: [1, 4, 9, 16, 25]

reduce() reduce()也接收兩個(gè)參數(shù),一個(gè)函數(shù),一個(gè)序列; reduce()也把函數(shù)作用在序列上,但是這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和系列的下一個(gè)元素做累計(jì)計(jì)算。

from functools import reduce
 def function1(x,y): 
return x + y 
reduce(function1,[1,2,3,4,5]) 
print('reduce result:',reduce(function1,[1,2,3,4,5])) 
//運(yùn)行結(jié)果: 
//reduce result: 15

filter() filter()的功能是過濾序列 跟map()類似,filter也接收一個(gè)函數(shù)一個(gè)序列 filter把函數(shù)作用于序列的每一個(gè)元素,根據(jù)函數(shù)返回的True或者False決定元素的保留還是去掉

def isOdd(x): 
return x % 2 == 1 
p = list(filter(isOdd,[1,2,3,4,5])) 
print('filter result:',p) 
//運(yùn)行結(jié)果: 
//filter result: [1, 3, 5]

sorted() 顧名思義,sorted()的功能就是對(duì)序列進(jìn)行排序 sorted也是一個(gè)高階函數(shù),可以接受一個(gè)key函數(shù)。key指定的函數(shù)將作用于list的每個(gè)元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序。

arr = [23,0,45,-13,46,85,-70]; 
print('sorted(arr)
sorted(arr)) 
#sorted(arr): [-70, -13, 0, 23, 45, 46, 85] 
print('sorted(arr,key=abs):'
sorted(arr,key=abs)) 
print('sorted(arr,key=abs,reverse=True)'
sorted(arr,key=abs,reverse=True)) 
//運(yùn)行結(jié)果: 
//sorted(arr,key=abs): [0, -13, 23, 45, 46, -70, 85] 
//sorted(arr,key=abs,reverse=True) [85, -70, 46, 45, 23, -13, 0]

返回函數(shù)

 高階函數(shù)不僅能接受函數(shù)作為參數(shù),還能把函數(shù)作為返回值返回。

def lazy_sum(*args): 
def sum(): 
ax = 0 
for n in args: 
ax = ax + n 
return ax 
return sum 
f = lazy_sum(1,2,3,4,5) 
print(f) 
print('f()=',f()) 
//運(yùn)行結(jié)果: 
//.sum at 0x109c85950> 
//f()= 15 
#運(yùn)行結(jié)果表明,當(dāng)我們調(diào)用lazy_sum的時(shí)候并不直接返回計(jì)算結(jié)果,而是返回sum函數(shù),當(dāng)我們執(zhí)行f()的時(shí)候才會(huì)計(jì)算結(jié)果*

匿名函數(shù)

 有些時(shí)候我們傳入一個(gè)函數(shù)作為參數(shù)的時(shí)候,不必要每次都對(duì)他進(jìn)行顯性的定義,python提供lambda創(chuàng)建匿名函數(shù) 匿名函數(shù)有一個(gè)現(xiàn)在就是只能有一個(gè)表達(dá)式,不用寫return,表達(dá)式的結(jié)果就是返回值 匿名函數(shù)沒有名字所以不存在函數(shù)名沖突的問題,使用匿名函數(shù)利于減少代碼,這與python倡導(dǎo)理念也是一致的。

s = reduce(lambda x,y: x+y,[1,2,3,4,5]) 
print('s=',s) 
//運(yùn)行結(jié)果:
//s= 15

偏函數(shù)

我理解的偏函數(shù)的功能是這樣的:

假如你有一個(gè)這樣的函數(shù):它的功能就是對(duì)人打招呼

def sayHello(name,greet): 
print(greet,name)

假設(shè)接下來你要對(duì)名字是'xiaoMing'這個(gè)人,用一百種方式跟他打招呼。 如果你知道默認(rèn)參數(shù),那么你肯定會(huì)想到用它,當(dāng)然沒錯(cuò),但是考慮到每次傳入實(shí)在是太麻煩了,所以:

def sayHelloToXiaoMing(greet,name='xiaoMing'): 
return sayHello(name,greet) 
sayHelloToXiaoMing('I love U');

其實(shí)sayHelloToXiaoMing就是sayHello的一個(gè)偏函數(shù)。 那么偏函數(shù)的功能到底是??沒錯(cuò),偏函數(shù)就是幫助我們直接創(chuàng)建一個(gè)偏函數(shù)的,而不需要我們自己去創(chuàng)建:

from functools import partial 
sayHelloToTom = partial(sayHello,'Tom') 
sayHelloToTom('Sawadika')

上述內(nèi)容就是怎么理解Python的函數(shù)式編程,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI