# 闭包函数
'''
闭包:
内函数使用了外函数的局部变量,
并且外函数把内函数返回出来的过程是闭包
这个内函数叫做闭包函数;
'''
# (1) 基本语法
def outer():
a = 5
b = 6
# inner 是闭包函数
def inner():
print(a,b)
return inner
res = outer() # res = inner
print(res)
res() # res() = inner()
# 获取闭包函数使用的变量 __closure__ , cell_contents (了解)
tup = res.__closure__
print("<==1==>")
print(tup)
# 获取元组里面第一个元素
obj = tup[0]
print(obj)
# 使用cell_contents来获取单元对象当中的值
res = obj.cell_contents
print(res)
obj2 = tup[1]
res2 = obj2.cell_contents
print(res2)
print("<==2==>")
# 闭包的特点:
"""
内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期
(实际内存给它存储了这个值,暂时不释放)
"""
# (2) 闭包函数特点
def majunqiang_family():
dajie = "马蓉"
erjie = "马冬梅"
kuang = "金矿"
# money 局部变量因为在闭包函数中使用,于是发生绑定,延长该变量的生命周期
money = 1000
def dajie_hobby():
nonlocal money
money -= 900
print("大姐喜欢花钱,喜欢买兰博基尼,喜欢买比基尼,喜欢买channel,家里钱还剩下%d" % (money))
def erjie_hobby():
nonlocal money
money += 500
print("二姐马冬梅喜欢赚钱,喜欢上长春扎疫苗,因为假疫苗能赔偿,喜欢卖血,5块钱一瓶,家里钱赚了%d" % (money))
def master():
# 返回一个元组,元组里面的每一个元素是函数
return (dajie_hobby,erjie_hobby)
return master
func = majunqiang_family()
tup = func()
print(tup)
# 大姐函数
dajie = tup[0]
dajie()
# 二姐函数
erjie = tup[1]
erjie()