python小白——进阶之路——day10天-———闭包函数

时间:2021-08-20 03:20:42
#闭包函数
'''
闭包:
内函数使用了外函数的局部变量
并且外函数把内函数返回的过程是闭包
这个函数叫做闭包函数;
'''
#(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("<========2===========>")
#闭包特点
"""
内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期
(实际内存给它存储了这个值,暂时不释放)
"""


def majunqiang_family():
dajie = "马蓉"
erjie = "马冬梅"
kuang = "金矿"
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()






#闭包函数
'''
闭包:
内函数使用了外函数的局部变量
并且外函数把内函数返回的过程是闭包
这个函数叫做闭包函数;
'''
#(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("<========2===========>")
#闭包特点
"""
内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期
(实际内存给它存储了这个值,暂时不释放)
"""


def majunqiang_family():
dajie = "马蓉"
erjie = "马冬梅"
kuang = "金矿"
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()



###闭包的特点
#(1)闭包的特点:
'''
内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期
(实际内存给它存储了这个值,暂时不释放)

'''
def outer(num):
def inner(val):
return num +val
return inner
func = outer(10) #func = inner
res =func(21) #func(21) = inner(21)
print(res) #res = num + val =10 + 21 =31
'''
代码解析:
num 接收到普通实参10 此刻num = 10
func = outer(10) #func = inner
res = func(21) # func(21) = inner(21)
print(res) #res = num +val = 10 +21 =31
'''
#闭包的意义
#模拟鼠标点击的操作
'''
#如果使用全局变量num来进行统计,因为作用域太大,容易造成漏洞,不安全
num= 0
def click_num():
global num
num +=1
print(num)
#调用一次函数,累加一次num
click_num()
click_num()
click_num()

num= 100
click_num()
click_num()
click_num()

'''
#闭包的意思:
'''
闭包可以优先使用外函数中的变量,并对闭包的值起到了封包保护的作用,外部无法访问

'''
def click_num():
num =0
def func():
nonlocal num
num+=1
print(num)
return func

click_num = click_num()
click_num()
click_num()
click_num()
num = 100
click_num()
click_num()