深入解析Python--Currying函數

零到壹度
發布: 2018-04-19 16:08:47
原創
2183 人瀏覽過

本文實例講述了深入解析Python--Currying函數。分享給大家供大家參考,如下:

一,定義:

    1) 指的是將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數回傳一個以原有第二個參數為參數的函數

    2)舉例:將加法函數Currying:其方法就是透過巢狀把函數轉換為Currying函數。

def add(x,y):
    return x + y
def add(x):
    def _add(y):
        return x + y
    return _add
登入後複製

二,應用:

    需求:

    加法函數,想增強它的功能,能夠輸出被呼叫過以及被呼叫的參數資訊。

def add(x,y):
    return x + y
登入後複製

現在我們增加訊息輸出功能

def add(x,y):
    print('call add,x + y')  #log output to the console
    return x + y
登入後複製

上面的加法函數雖然完成了需求,但有以下三個缺點:

    1.列印語句的耦合度太高。

    2.加法函數屬於業務功能,而輸出資訊的功能能屬於非業務功能代碼,不該放在業務函數加法中。

那我們做出下面改進:

def add(x,y):
    return x + y
def logger(fn):
    print('begin')  #enhanced output
    x = fn(4,5)
    print('end')    #enhanced features
    return x
print(logger(add))
登入後複製

上面的改進做到了業務功能分離,但是fn函數呼叫傳參是個問題。我們想要靈活的傳入參數,但是參數卻在內部函數裡面,如何用靈活的語言python來解決這個問題呢?

def add(x,y):
    return x + y
def logger(fn):
    def _logger(*args,**kwargs):
        print('begin')
        c = fn(*args,**kwargs)
        print('end')
        return c
    return _logger
logger(add)(2,3)
登入後複製

現在,我們可以靈活的輸入參數了

下面給出幾個更具體的例子:

def ad1(m,n,*,l=909):
    return m + n + l
def loger(fn,*args,**kwargs):
    print('What\'s the matter?')
    ret = fn(*args,**kwargs)
    return ret
print(loger(ad1,2,3,l=4))   #Can you currying them?
登入後複製
def add(x,y,*,z=9):
    return x + y + z
def logger(fn,*args,**kwargs):
    print('This is a stupid function')
    ret = fn(*args,**kwargs)  #after collections it needs to be deconstructed
    return ret
print(logger(add,2,4,z=17))
登入後複製
def ad1(m,n,*,l=909):
    return m + n + l
def loger(fn):
    def _loger(*args,**kwargs):   #append a function as wrapper
        print('What\'s the matter?')    
        ret = fn(*args,**kwargs)   #the function which is be wrapped and transfer args and kwargs
        return ret
    return _loger
#print(loger(ad1)(2,3,l=4))  also okay
t = loger(ad1)  #defind the function loger
r = t(2,3,l=4)  # income parameters and transfer it
print(r)
登入後複製

   三,總結:

#    Currying學習完畢之後會有python中最重要的最精髓的知識在等著我們--裝飾器


相關推薦:

#js函數柯里化

#函數式中的Currying

#JavaScript 函數的scope,currying

#Currying

以上是深入解析Python--Currying函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板