闭包

  1. 函数嵌套, 即外部函数嵌套一个内部函数;
  2. 外部函数返回内部函数引用;
  3. 内部函数使用外部函数的变量或者形参
# 简单演示
# def f1(x):
#
#     def f2():
#         print(x)
#
#     return f2


装饰器

装饰器:不修改被装饰对象的源代码,也不修改调用方式的前提下,给被装饰对象添加新的功能

  • 装饰器
  • 器:器具,工具
  • 装饰:为其他事物添加额外的功能
  • 定义一个函数,这个函数的功能就是用来装饰其他函数的
  • 也就是说这个函数是用来给其他函数添加额外的功能的
def inner(name):
    print(name)
    print('原来函数')

# 增加统计程序运行时间的功能
def outer(func):
    # func = inside
    def wrapper(*args, **kwargs):
        import time
        start = time.time()
        func(*args, **kwargs)
        time.sleep(1)
        end = time.time()
        print('所用时间:',end-start)
    return wrapper

# 调用:先用装饰器装饰一下,然后调用
inner = outer(inner)
inner('aaaa')
# 增加统计程序运行时间的功能
def outer(func):
    # func = inside
    def wrapper(*args, **kwargs):
        import time
        start = time.time()
        func(*args, **kwargs)
        time.sleep(1)
        end = time.time()
        print('所用时间:',end-start)
    return wrapper

# 语法糖 必须装饰器写好了才可以,直接装饰需要装饰的函数
@outer  # 相当于 inner = outer(inner)
def inner(name):
    print(name)
    print('原来函数')
# 调用:使用语法糖就可以直接调用
inner('aaaa')

# 可能上边写的有返回值,但是经过装饰,返回值找不到了
# 还是有变化、
# 所以完美的模板应该如下
def outer(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res
    return wrapper
# 想要添加功能,在模板里添加