高阶函数:接受一个或多个函数作为参数或者返回值是一个函数;
def counter(base): def inc(step=1): nonlocal base base += step return base return inc foo = counter(5) print(foo())
柯里化
指的是将原来接收两个或多个参数的函数变成接收一个参数的函数,并且返回接收余下的参数且返回结果的新函数;如 z = f(x,y) 转换成 z = f(x)(y)的形式
将加法函数柯里化 def add(x, y): return x + y 转换如下 def add(x): def _add(y): return x+y return _add add(5)(6) 通过嵌套函数就可以把函数转换成柯里化函数
装饰器
我理解的装饰器就是:需要在源功能函数上增加某种功能,又不改变源函数的调用方式和参数个数;
加法函数,想要增加被调用是输出调用参数信息
def add(x,y): return x + y
增加信息输出功能
def add(x,y): print('call add, x + y') return x + y
#更改了源函数中的内容,不符合要求; def add(x,y): return x + y def logger(fn): print('begin') x = fn(4,5) #参数写死; print('end') return x print(logger(add)) #参数传递有问题; def add(x,y): return x + y def logger(fn,*args,**kwargs): print('begin') x = fn(*args,**kwargs) print('end') return x print(logger(add,5,y=60)) #参数传递问题解决了,调用方式还需要调整; def add(x,y): return x + y def logger(fn): def wrapper(*args,**kwargs): print('begin') x = fn(*args,**kwargs) print('end') return x return wrapper #print(logger(add)(5,y=50)) add = logger(add) print(add(x=5,y=10)) #柯里化一下,最后输出,两种写法一样,理解一下; def logger(fn): def wrapper(*args,**kwargs): print('begin') x = fn(*args,**kwargs) print('end') return x return wrapper @logger # 等价于add = logger(add) def add(x,y): return x + y print(add(45,40)) #装饰器, @logger需要写在下面,写在上面会报NameError; 装饰器: import datetime import time def logger(fn): def wrap(*args, **kwargs): # before 功能增强 print("args={}, kwargs={}".format(args,kwargs)) start = datetime.datetime.now() ret = fn(*args, **kwargs) # after 功能增强 duration = datetime.datetime.now() - start print("function {} took {}s.".format(fn.__name__, duration.total_seconds())) return ret return wrap @logger # 等价于 add = logger(add) def add(x, y): print("===call add===========") time.sleep(2) return x + y print(add(4, y=7))
装饰器是一个函数,形参是一个函数,返回值也是一个函数;