当前位置: 首页 > 后端技术 > Python

3.Python高阶函数和装饰器

时间:2023-03-26 18:06:09 Python

1高阶函数1.1数学概念复习数学知识:y=f(x)这是第一个常用函数y=g(f(x))这是我们的高阶函数遇到的高阶函数在数学和计算机科学中,高阶函数应该是至少满足以下条件之一的函数:1)接受一个或多个函数作为参数2)输出一个函数我们在程序中的高阶函数相似示例计数器函数:defcounter(base):definc(step=1):nonlocalbasebase+=stepreturnbasereturninc1.2Built-infunctionapplicationhigh-orderfunctionexamplesorte(iterable,key)Sortandreturnalistfilter(function,iterable)过滤可迭代对象的元素,返回一个迭代器map(function,*iterable)-->mapobject根据指定的函数映射多个可迭代对象的元素,返回一个迭代器2装饰2.1自定义高阶函数2.1.1CurryingCurrying在自定义高阶函数之前,先了解一下Currying柯里化:柯里化:是指把一个原来接受两个参数的函数变成一个新的接受一个参数的函数,新函数返回一个函数z=f(x,y)将原来的第二个参数作为参数,通过嵌套函数将其转化为z=f(x)(y),将函数转化为Ke局部化函数的例子defadd(x,y):returnx+y变化后defadd(x):def_add(y):nonlocaltxreturnx+yreturn_add这是一个简单的高阶函数2.2高阶函数应用——装饰器介绍:有一个add函数.defadd(x,y):returnx+y这个add()太low了,我需要增强它的功能,比如添加信息输出函数:defadd(x,y):print("calladd,{}+{}".format(x,y))returnx+y上面的加法函数满足了我的需求,但还是不够好。有以下缺点:1)打印语句的耦合度太高。2)add()属于业务功能,输出信息属于非业务功能代码。log之类的东西不适合放add()函数。然后改进:defadd(x,y):returnx+ydeflogger(fn):print("开始业务执行")x=fn(4,5)print("执行结束,结果:",x)print(logger(add))更好,我们继续改进defadd(x,y):returnx+ydeflogger(fn,x,y):print("Startbusinessexecution")ret=fn(x,y)print("Endofexecution",)returnret改进后,fn的参数仍然有限,只能用于带两个参数的add。我想让记录器适用于更广泛的范围。比如我有一个sum(x,y,z)继续改进deflogger(fn,*args,**kwargs):print("Startbusinessexecution")ret=fn(*args,**kwargs)print("执行结束")returnre此时,进行柯里化deflogger(fn):def_logger(*args,**kwargs):print('before')ret=fn(*args,**kwargs)print('after')returnretreturn_logger#调用如下add=logger(add)#因为是函数调用,函数内部使用参数add的引用来保存add(4,5)#内部保存调用addreference而不是原来的add函数Python将其改进为装饰deflogger(fn):def_logger(*args,**kwargs):print('before')ret=fn(*args,**kwargs)print('after')returnretreturn_logger@loggerdefadd(x,y):returnx+yprint(add(4,10))装饰器是高阶函数的一个重要应用,是函数装饰或者传入函数的功能增强。