Python_复习_33

Posted LXL_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python_复习_33相关的知识,希望对你有一定的参考价值。

+# 函数 —— 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\')
# 迭代器和生成器 —— 两天
# 内置函数 —— 两天

以上是关于Python_复习_33的主要内容,如果未能解决你的问题,请参考以下文章

day9-复习学习python实例

python复习-面向对象拾遗

Python 复习

Python_装饰器复习_30

Python_复习_习题

Python__文件复习2