装饰器

高阶函数:接受一个或多个函数作为参数或者返回值是一个函数;

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))

装饰器是一个函数,形参是一个函数,返回值也是一个函数;

原文地址:https://www.cnblogs.com/52py/p/7693439.html