闭包方法:
通过一定的方式将函数内部的局部变量或者内部函数转移到函数之外的方法
方法一
基本原理就是:
让一个内部函数带着函数中的数据通过return返回出来,然后这个出来的内部函数再通过return把它带出来的数据返回出来,然后用变量接受!
代码送上
def test():
#局部变量
var = '局部变量'
var1 = '局部变量1'
var2 = '局部变量2'
#内部函数
def func():
print('内部函数')
def func1():
print('内部函数1')
def func2():
print('内部函数2')
#把想调出的
return (var,var1,var2,func,func1)
return func2
#调出内部函数
result = test() #(func2)
print(result)
result1 = result() #
print(result1)
val = result1[0]
val1 = result1[1]
val2 = result1[2]
func3 = result1[3]
func4 = result1[4]
print(val)
print(val1)
print(val2)
func3()
func4()
例子:
def home():
#局部变量
#钱
money = '100越南盾'
#狗
dog = '旺财'
#内部函数
#妹妹
def newsister():
print('老娘是卫东的妹妹!')
#车
def car():
print('老子是卫东家的拖拉机')
# 姐姐
def oldsister():
#在姐姐离家之前,从家里搬东西
print('我是卫东的姐姐')
#存放东西的容器,元祖
return (money,dog,car,newsister)
#姐姐离家出走
return oldsister
#调用函数
#天宝来接应卫东的姐姐
tianbao = home()
#提前查看带出来的内部数据
print(tianbao.__closure__)
#接收卫东姐姐带出来的东西#相当与调用乐 oldsister的函数
things = tianbao()
print(things)
#接收钱
qian = things[0]
#接收狗
gou = things[1]
#接收车
che = things[2]
#接收妹妹
meimei = things[3]
print(qian)
print(gou)
che()
meimei()
图解:
方法二
基本原理就是:
先声明一个全局变量,然后在函数内部再把需要的数据以元组的形式赋值给这个全局变量,然后调用一遍函数,这个全局变量就被重新赋值了,因为是个元祖类型,可以用索引把想要的数据获取出来!
但是这个方法我们并不推荐使用因为容易污染全局变量空间导致特定名称的变量产生!
话不多说,代码送上...
#声明一个全局变量
spvar = None
def test():
#全局声明一下全局变量
global spvar
#局部变量
var = 10
var2 = 11
var3 = 12
print('test')
#内部函数
def func():
print('内部函数')
def func1():
print('内部函数1')
def func2():
print('内部函数2')
spvar = (var,var2,func1,func2)
调用函数
#调用函数
test()
#打印全局变量(元组)
print(spvar)
#访问变量
print(spvar[0],spvar[1])
spvar[2]()
spvar[3]()
例子:
#声明张帅变量
zhangshuai = None
#伟任的家
def home():
#全局声明(到别人家认干亲)
global zhangshuai
#局部变量
#钱
money = 1
#狗
dog = '大黄'
#猫
cat = '咪咪'
#内部函数
#妹妹
def sister():
print('我是伟任的小妹妹~')
#弟弟
def brother():
print('我是伟任的小弟弟~')
#张帅 打包干爹干妈加的东西
zhangshuai = (money,dog,sister)
调用函数
#调用函数
home()
#访问zhangshuai变量
print(zhangshuai)
#钱
qian = zhangshuai[0]
#狗
gou = zhangshuai[1]
#小妹妹
meimei = zhangshuai[2]
#访问所有带出来的数据
print(qian)
print(gou)
meimei()
图解: