• Python_复习_34


    +# 函数 —— 2天
    # 函数的定义和调用
    # def 函数名(形参):
    #函数体
    #return 返回值
    #调用 函数名(实参)
    # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
    # 站在实参的角度上 : 按照位置传,按照关键字传
    # 返回值:没有返回值 返回一个值 返回多个值
    # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
    # 闭包函数 —— 在内部函数引用外部函数的变量
    # 装饰器函数—— 装饰器一定是闭包函数
    # 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
    # 完美的符合了一个开发原则 :开放封闭原则
    # 对扩展是开发的
    # 对修改是封闭的
    # 基础的装饰器
    # from functools import wraps
    # def wrapper(func):
    # @wraps(func)
    # def inner(*args,**kwargs):
    # '''在函数被调用之前添加的代码'''
    # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
    # '''在函数被调用之后添加的代码'''
    # return ret
    # return inner
    # 使用 —— @wrapper
    # @wrapper
    # def func(): #inner
    # pass
    #
    # func.__name__


    不使用functools.wraps的装饰器:
    def tracer(func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
            return result
        return wrapper
    
    @tracer
    def fibonacci(n):
        if n in (0,1):
            return n
        return (fibonacci(n-1)+fibonacci(n-2))
    
    
    fibonacci(3)
    print(fibonacci)
    print('help:')
    help(fibonacci)

    结果:

    可以看到,装饰器完全可以正常工作。。。

    但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

    也就是说,原函数的属性失效了

    如果想要保留原函数的属性,就可以用到functools.wraps了

    from functools import wraps
    def tracer(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
            return result
        return wrapper
    
    @tracer
    def fibonacci(n):
        if n in (0,1):
            return n
        return (fibonacci(n-1)+fibonacci(n-2))
    
    
    fibonacci(3)
    print(fibonacci)
    print('help:')
    help(fibonacci)

    结果:






    # 带参数的装饰器
    # @wrapper -- > @warapper(argument)
    # 三层嵌套函数
    # def outer(形参):
    # def wrapper(func):
    # def inner(*args,**kwargs):
    # '''在函数被调用之前添加的代码'''
    # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
    # '''在函数被调用之后添加的代码'''
    # return ret
    # return inner
    # return wrapper
    # @outer(True)
    # def func():
    # pass
    # 多个装饰器装饰一个函数
    # 俄罗斯套娃

    #def wrapper1(func):
    # @wraps(func)
    # def inner(*args,**kwargs):
    # print('before 1')
    # print('******')
    # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
    # '''在函数被调用之后添加的代码'''
    # return ret
    # def wrapper2(func):
    # @wraps(func)
    # def inner(*args,**kwargs):
    # print('before 2')
    # ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
    # '''在函数被调用之后添加的代码'''
    # return ret
    # @wrapper1
    # @wrapper2
    # def func():
    # print('111')
    # 迭代器和生成器 —— 两天
    # 内置函数 —— 两天
  • 相关阅读:
    二柱子在线答题
    SWUST OJ(952)
    SWUST OJ (943)
    FileZilla 客户端连接 FlieZilla 服务器 连接成功读取目录列表却失败的解决办法
    串的模式匹配算法 ------ KMP算法
    lvalue require as increment operand
    c 语言连续输入字符型数据
    [pat]数素数
    [PAT]数字分类
    HDOJ_4540_威威猫系列故事——打地鼠
  • 原文地址:https://www.cnblogs.com/LXL616/p/10668323.html
Copyright © 2020-2023  润新知