一、闭包函数
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.返回原来的函数的注释