#python?3.3
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供南譙企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為南譙眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
def?make_adder(addend):
def?adder(augend):
return?augend?+?addend
return?adder??
print(make_adder(10)(20))
參考:
不用
高階函數(shù)
編輯
原理
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,高階函數(shù)是至少滿足下列一個(gè)條件的函數(shù):
接受一個(gè)或多個(gè)函數(shù)作為輸入
輸出一個(gè)函數(shù)
在數(shù)學(xué)中它們也叫做算子(運(yùn)算符)或泛函。微積分中的導(dǎo)數(shù)就是常見(jiàn)的例子,因?yàn)樗成湟粋€(gè)函數(shù)到另一個(gè)函數(shù)。
在無(wú)類型?lambda演算,所有函數(shù)都是高階的;在有類型?lambda演算(大多數(shù)函數(shù)式編程語(yǔ)言都從中演化而來(lái))中,高階函數(shù)一般是那些函數(shù)型別包含多于一個(gè)箭頭的函數(shù)。在函數(shù)式編程中,返回另一個(gè)函數(shù)的高階函數(shù)被稱為柯里化的函數(shù)。
在很多函數(shù)式編程語(yǔ)言中能找到的 map 函數(shù)是高階函數(shù)的一個(gè)例子。它接受一個(gè)函數(shù) f 作為參數(shù),并返回接受一個(gè)列表并應(yīng)用 f 到它的每個(gè)元素的一個(gè)函數(shù)。[1]
范例
高階函數(shù)的其他例子包括函數(shù)復(fù)合、積分和常量函數(shù) λx.λy.x。
這是一個(gè)Python的例子, 其中函式 g() 有一引數(shù)以及回傳一函數(shù). 這個(gè)例子會(huì)打印 100 ( g(f,7)= (7+3)×(7+3) ).
12345? ?def?f(x):return?x?+?3def?g(function,?x):return?function(x)?*?function(x)print?g(f,?7)? ?
答案中的方法使用函數(shù)裝飾器實(shí)現(xiàn)
def currying(func, n=None):
n = n or func.__code__.co_argcount
def merge(*head):
? k = len(head)
? if k == n:
? ? ? return func(*head)
? elif k n:
? ? ? return currying(lambda *tail: func(*(head + tail)), n - k)
? elif k n:
? ? ? raise TypeError('Too many arguments:', head)
return merge
裝飾器代碼
通過(guò)對(duì)目標(biāo)函數(shù)進(jìn)行裝飾,實(shí)現(xiàn)目標(biāo)函數(shù)柯里化,原理是對(duì)目標(biāo)函數(shù)的參數(shù)進(jìn)行計(jì)數(shù),當(dāng)接收參數(shù)達(dá)到指定個(gè)數(shù)時(shí)進(jìn)行計(jì)算,否則保存已有的參數(shù),其中 currying 函數(shù)的第一個(gè)參數(shù)是目標(biāo)函數(shù),第二個(gè)參數(shù)是接收的參數(shù)數(shù)量,默認(rèn)值為目標(biāo)函數(shù)的參數(shù)個(gè)數(shù)。
示例代碼
如上圖代碼所示,add3 函數(shù)使用 currying 函數(shù)裝飾,即可實(shí)現(xiàn)柯里化
運(yùn)行結(jié)果