学习视频:https://www.bilibili.com/video/BV1SE411N7Hi?p=63
理论概念:https://guobaoyuan.gitee.io/new_book/Python/13-2 闭包.html
以下内容仅供个人学习使用,侵删
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' 闭包:函数的嵌套 闭包:不使用全局变量,(且不是本层变量)就是闭包 为什么学习:闭包的作用就是能够保护数据的安全性及干净性 闭包怎么用: 闭包的应用场景: 装饰器;保护数据的安全性 ''' def foo(): lst=[]#保证不会被其他人定义的同一变量名的变量修改内容,从而保证安全性 def func(money): lst.append(money)#变量提升,自由变量 print(sum(lst)/len(lst)) return func func=foo() func(150000)#第一天 func(250000)#第二天 func(300000)#第三天 func(150000)#第四天 lst=[12,3,4,5,6] print(sum(lst)/len(lst))#此处的lst不会影响上面的lst def foo1(): a=[] def func(num): a.append(num) print(a) return func ret=foo1() ret(1)#[1] ret(2)#[1,2] ret(3)#[1,2,3] #---------- foo1()(1)#[1] foo1()(2)#[2] #---------- #注意与下面函数的区别 def foo(num): a=[] def func(num): a.append(num) func(num) print(a) foo(1)#[1] foo(2)#[2] foo(3)#[3] #判断以下内容是不是闭包 def foo(a): def func(a): print(a)#此处a使用的是本层的 print(func.__closure__)#查看是否为闭包,None,不是闭包 return func a=10 ret=foo(a)#ret=func ret(a)#func(10) # 不是闭包 #修改后,是闭包 def foo(a): def func(): print(a) print(func.__closure__)#有内容,则为闭包,(<cell at 0x0000021639E537F8: int object at 0x0000000071E661C0>,) return func a=10 ret=foo(a)#ret=func ret()#func(10) #---练习---- #肉眼验证是否为闭包 三要素: # 1.最里层的函数有没有形参 # 2.最里层的函数有没有定义变量 # 3.全局空间有没有这个变量 # 例一: def wrapper(): a = 1 def inner(): print(a) return inner ret = wrapper() #是闭包 #---------------------- def wrapper(): a = 1 def foo(): def inner(): print(a) return inner return foo ret = wrapper() #是闭包 # 例二: a = 2 def wrapper(): def inner(): print(a) print(inner.__closure__)#none return inner ret = wrapper() #不是闭包,用的全局变量 # 例三: def wrapper(a,b):#传参,隐形赋值,用的不是全局的 def inner():#从加载顺序看,在inner找a,b,再在wrapper找a,b,找到了,没有使用全局的a,b print(a) print(b) print(inner.__closure__) return inner a = 2 b = 3 ret = wrapper(a,b) #是闭包