本文实例讲述了深入解析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中最最重要的最最精髓的知识在等着我们--装饰器。
相关推荐:
以上是深入解析Python--Currying函数的详细内容。更多信息请关注PHP中文网其他相关文章!