python函数式编程思想_以python为例,浅谈函数式编程思想
引
數(shù)據(jù)集data_socrestudentid course score
1 math 89
2 english 76
. . .
問題:求各studentid總分
方法1-一般寫法:
student_score_total={}
for i in xrange(data_socre.shape[0]):
studentid=data_socre.ix[i,'studentid']
score=data_socre.ix[i,'score']
if studentid in student_score_total.keys():
student_score_total[studentid]+=score
else:
student_score_total[studentid]=score
方法2-函數(shù)式編程:
student_score_total=data_socre.ix[:,['studentid','score']].groupby('studentid').agg(sum)
函數(shù)式編程要明顯優(yōu)于一般寫法(代碼量、可讀性)
那什么是函數(shù)式編程:
函數(shù)式編程定義
定義(百度百科):函數(shù)式編程是種編程方式,它將電腦運(yùn)算視為函數(shù)的計(jì)算。函數(shù)編程語(yǔ)言最重要的基礎(chǔ)是λ演算(lambda calculus),而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值)。簡(jiǎn)單說(shuō),"函數(shù)式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論。它屬于"結(jié)構(gòu)化編程"的一種,主要思想是把運(yùn)算過(guò)程盡量寫成一系列嵌套的函數(shù)調(diào)用。
特性
一、高階函數(shù)
和一般函數(shù)差別:
1、輸入?yún)?shù)可以是函數(shù)
2、輸出結(jié)果可以是函數(shù)
例(python2.7,下同):
輸出結(jié)果可以是函數(shù)
def add(x,y):
def add_1():
return x+y
return add_1
add_1=add(1,2)
print add_1
輸入?yún)?shù)可以是函數(shù)
def add(x,y):
return x+y
def add_square(add):
return add*add
計(jì)算
print add_square(add(1,2))
9
二、閉包
定義(百度百科):閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的橋梁。
構(gòu)成(必要):
1、外部函數(shù)
2、內(nèi)部函數(shù)
3、外部函數(shù)變量
例:
def add(x,y):
def add_1():
return x+y
return add_1
外部函數(shù)(add):必須將內(nèi)部函數(shù)作為返回
內(nèi)部函數(shù)(add_1):必須要有一個(gè)內(nèi)部函數(shù)
外部函數(shù)變量(x,y):內(nèi)部函數(shù)必須引用外部函數(shù)變量
ps.可以發(fā)現(xiàn)閉包和高階函數(shù)是結(jié)合在一起使用
三、偏函數(shù)
定義:通過(guò)固定函數(shù)的部分參數(shù)值從而達(dá)到新建函數(shù)的作用
例:
def add(x,y):
return x+y
import functools
add_1 = functools.partial(add,x = 10)
print add_1(y=1) #等價(jià)于 add(x=10,y=1)
11
四、柯里化
定義:把有多個(gè)參數(shù)的函數(shù)變成單參數(shù)函數(shù) 公式:z = f(x, y) 變成 z = f(x)(y)
例:
def add(x, y):
return x+y
print add(1, 2)
3
def add(x):
def add_1(y):
return x + y
return add_1
print add(1)(2)
3
柯里化的偏函數(shù)應(yīng)用
add_1 = add(x=1)
print add_1(y=2)
3
ps.python中只能對(duì)第一個(gè)參數(shù)做偏函數(shù)化(或者說(shuō)只能是從外到內(nèi)逐次參數(shù)做偏函數(shù)化)
五、惰性計(jì)算
理解:表達(dá)式不在它被綁定到變量之后就立即求值,而是在該值被取用的時(shí)候求值;邏輯處理與具體運(yùn)算時(shí)間分離,只有當(dāng)提交具體執(zhí)行計(jì)算任務(wù)時(shí),邏輯處理才開始運(yùn)算
六、只用"表達(dá)式"
理解(百度百科):"表達(dá)式"(expression)是一個(gè)單純的運(yùn)算過(guò)程,總是有返回值。也就是說(shuō),每一步都是單純的運(yùn)算,而且都有返回值。
七、沒有"副作用"
理解:不產(chǎn)生除函數(shù)返回結(jié)果以外的任何影響(不修改任何外部變量)
八、引用透明性
理解:輸入相同的參數(shù)返回相同的結(jié)果;計(jì)算結(jié)果不依賴除輸入?yún)?shù)外的其他因素的影響
總結(jié):
函數(shù)式編程優(yōu)點(diǎn)
1、將問題處理拆解為各執(zhí)行步驟:處理邏輯清晰、代碼可讀性高、后期易維護(hù)更新
2、通過(guò)使用已有的函數(shù),大幅減少代碼量,提高編程效率
3、將邏輯處理和具體計(jì)算分離,通過(guò)組件化編程,降低使用者技術(shù)門檻(復(fù)雜邏輯處理由技術(shù)較好的人員事先實(shí)現(xiàn)準(zhǔn)備好)
總結(jié)
以上是生活随笔為你收集整理的python函数式编程思想_以python为例,浅谈函数式编程思想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫如何运行在web_Pyt
- 下一篇: python实例变量初始化_Python