• 装饰器


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

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

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

  • 相关阅读:
    Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数
    JDBC连接MySQL数据库及演示样例
    FusionCharts简单教程(一)---建立第一个FusionCharts图形
    破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV
    DB9 公头母头引脚定义及连接
    第二届战神杯线上编程挑战赛月赛第一题:回文数
    白话经典算法系列之七 堆与堆排序
    开发人员程序猿10大聚集地
    对不起,说句粗话——这个太屌了,windows1.0安装程序(附下载)
    Arduino入门套件 Arduino UNO R3
  • 原文地址:https://www.cnblogs.com/52py/p/7693439.html
Copyright © 2020-2023  润新知