深入解析Python--Currying函数
本文实例讲述了深入解析Python--Currying函数。分享给大家供大家参考,具体如下:
一,定义:
1) 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
2)举例:将加法函数Currying:其方法就是通过嵌套把函数转化为Currying函数。
def add(x,y): return x + ydef add(x): def _add(y): return x + y return _add
二,应用:
需求:
一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息。
def add(x,y): return x + y
现在我们增加信息输出功能
立即学习“Python免费学习笔记(深入)”;
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 + ydef logger(fn): print('begin') #enhanced output x = fn(4,5) print('end') #enhanced features return xprint(logger(add))
上面的改进做到了业务功能分离,但是fn函数调用传参是个问题。我们想要灵活的传入参数,但是参数却在内部函数里面,如何用灵活的语言python来解决这个问题呢?
def add(x,y): return x + ydef logger(fn): def _logger(*args,**kwargs): print('begin') c = fn(*args,**kwargs) print('end') return c return _loggerlogger(add)(2,3)
现在,我们可以灵活的输入参数了
下面给出几个更具体的例子:
def ad1(m,n,*,l=909): return m + n + ldef loger(fn,*args,**kwargs): print('What's the matter?') ret = fn(*args,**kwargs) return retprint(loger(ad1,2,3,l=4)) #Can you currying them?
def add(x,y,*,z=9): return x + y + zdef logger(fn,*args,**kwargs): print('This is a stupid function') ret = fn(*args,**kwargs) #after collections it needs to be deconstructed return retprint(logger(add,2,4,z=17))
def ad1(m,n,*,l=909): return m + n + ldef 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 okayt = loger(ad1) #defind the function logerr = t(2,3,l=4) # income parameters and transfer itprint(r)
三,总结:
Currying学习完毕之后会有python中最最重要的最最精髓的知识在等着我们--装饰器。