闭包
- 闭包实现
- 函数嵌套
- 外函数里包装一个内函数
- 外函数作用域有一个局部数据对象
- 内部函数对于外部函数作用域里非全局变量的引用
- 外函数返回内部函数
def func_wai(a):
def func_nei():
print(a)
return func_nei()
与递归有些类似,将尾递归中return,调用自己,更改为了内部函数
闭包的意义
-
实现函数内部变量的延续
每个函数运行都会开辟新的内存空间,在函数结束时,内部变量都将被释放
闭包则延续了局部变量的生命周期
-
变量生命周期得到延续,同时也增加了内存损耗
def wai(): p = list(range(1000)) def nei(): p[0] += 1 print(p[0]) return nei func = wai() # p 是一个保持状态的变量 #返回值载体 就相当于变量 #当你不去释放一个变量,会一直存活的
-
变量私有化
每一次闭包函数执行后的返回值都是一个新的,这是因为函数运行首先开辟的都是一块新的函数临时空间 每一次闭包函数执行后,都是返回了一个不一样的闭包函数载体,那么这个载体里的变量,也是不一样的
装饰器
- 装饰器可以在函数运行前添加功能,并且不影响原有函数内容
- 实际是将函数作为一个参数,带入到另外一个函数用运行
# 简单的装饰器
def wai(func):
def nei():
res = func()
return res + '你好'
return nei
@wai
def work():
return '123'
#------输出---------
work()
-
被装饰函数带参数
def wai(func): #装饰器 def nei(var1,var2): var1 = 100 #在闭包函数内部对被装饰函数参数进行干预 var2 = 99 return func(var1,var2) return nei @wai def work(a,b): return a + b res = work(20,30) #wai(work)(a,b) print(res)
-
装饰器带参数
def A(*args): def B(func): def C(a,b): print('我是被装饰函数的参数:',a,b) print('我是装饰函数的参数:',*args) return func return C return B @A('ss') def func(a,b): pass func(1,2) ---------- 我是被装饰函数的参数: 1 2 我是装饰函数的参数: ss
-
过程分析
def wai(b_func): #外函数的参数是一个函数对象 def nei(): print("嘿嘿嘿") #在nei函数里写的代码基本上都是添加的功能 return b_func() #这个是nei函数返回值,用来返回之前在wai函数所接收的参数 #b_func() #return '' return nei #返回了wai函数里的这个定义好的闭包容器 @wai #语法糖 def func(): print('哈哈哈哈') return 'func' res = func() #调用一个被装饰函数 其实相等于 wai(func)() print('func的返回值:',res) ------------------------------------- #func() 传统函数调用 #1: print('哈哈哈') #2: return None #func() 被装饰时调用 @wai #被装饰函数: func #装饰器函数: wai #1: wai(func) -> return nei #2: nei() -> #1: print("嘿嘿嘿") #2: return b_func() #1: b_func() -> 'func' #内部调用被装饰函数 #2: return 'func' #内部闭包函数的返回值 其实是被装饰函数的返回值