闭包函数和装饰器

一、闭包函数

  1.定义在函数内部的函数

  2.内部函数引用了外部函数名称空间作用域的名字

  主要满足上面的两点都叫做闭包函数

  

  顾名思义,函数里面包了个函数

  闭包用于给里面函数传参

  函数传参两种情况:

        1、直接传参

        2、闭包

  闭包函数运行步骤图:

 

 

二、装饰器

  1.含义

    用修饰器原因:修饰函数,是函数更好用(添加新的功能)

    因旧函数添加新功能,不可改调用方式,又不能改旧函数(被修饰对象)源代码

    即两个原则

      1.不改变被装饰对象源代码

      2.不改变被装饰对象(可调用对象)调用方式

def index(): 
      print('x')       #原始函数    
#outter+inner函数组成index  函数的装饰器
def outter(func)      #  func = 最原始的index函数的内存地址
    def inner(*args,**kwargs)
        func()       #func = index函数的内存地址,加()直接调用
        print('y')
    return inner  
index = outter(index)  # outter (最原始的index函数内存地址)
# index指向 inner函数的内存地址
index()  

  2.装饰器 语法糖

   作用:不改变最原始函数的

  @+下层函数名   #  函数名 = 修饰函数名(函数名)

    装饰器在装饰的时候 顺序从下往上

    装饰器在执行的时候 顺序从上往下

@outter1  # index = outter1(func2)
@outter2  # func2 = outter2(func1)
@outter3  # func1 =  outter3(index)
def index():
    pass

 

  3.装饰器固定格式

1 def outter(func):
2     def inner(*args,**kwargs):
3         print('执行被装饰函数之前 你可以做的操作')
4         res = func(*args,**kwargs)
5         print('执行被装饰函数之后 你可以做的操作')
6         return res
7     return inner

    4、装饰器修复技术

    from functools import wraps

    def  outter(func):

      @wraps(func)

      def ...

    1.返回原来的函数的函数名

    2.返回原来的函数的注释

 

posted @ 2019-07-11 21:52  小王八+1  阅读(104)  评论(0编辑  收藏  举报