1.什么是闭包函数?
互相嵌套的两个函数,如果内函数使用了外函数的局部变量
并且外函数把内函数返回出来的过程,叫做闭包
里面的内函数叫做闭包函数
是不是闭包?
1.内函数用了外函数的那个局部变量
2.外函数返回内函数
2.闭包函数有什么用?
在闭包函数中,内函数使用了外函数的局部变量,
该变量会与内函数发生绑定,延长该变量的生命周期,
持续到脚本执行结束.
全局变量的作用域大,容易被篡改,闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.
3.闭包函数代码:
1 def son_family(): 2 father = "马某" 3 def hobby(): 4 print("我对钱没有一丝丝的兴趣,我不看重钱,这是我爸爸{}说的".format(father)) 5 return hobby 6 7 func = son_family() 8 func()
闭包的复杂形式
1 def zhaowanli_family(): 2 gege = "王某某" 3 didi = "鞋王,高某某" 4 money = 1000 5 6 def gege_hobby(): 7 nonlocal money 8 money -= 500 9 print("我交朋友不在乎他有没有钱,反正都没有我有钱.我就喜欢交女朋友... 钱物还剩下{}".format(money)) 10 11 def didi_hobby(): 12 nonlocal money 13 money -= 400 14 print("家里有鞋柜,各式各样的奢侈鞋,一双大概20~30万,钱物还剩下{}".format(money)) 15 16 def big_master(): 17 return [gege_hobby,didi_hobby] 18 19 return big_master 20 21 func = zhaowanli_family() 22 print(func) 23 lst = func() 24 print(lst) 25 26 # 获取哥哥函数 27 gege = lst[0] 28 gege() 29 # 获取弟弟函数 30 didi = lst[1] 31 didi() 32 33 结果: 34 <function zhaowanli_family.<locals>.big_master at 0x000001601A027510> 35 [<function zhaowanli_family.<locals>.gege_hobby at 0x000001601A027400>, <function zhaowanli_family.<locals>.didi_hobby at 0x000001601A027488>] 36 我交朋友不在乎他有没有钱,反正都没有我有钱.我就喜欢交女朋友... 钱物还剩下500 37 家里有鞋柜,各式各样的奢侈鞋,一双大概20~30万,钱物还剩下100
3.使用 __closure__ , cell_contents 判定闭包
"""如果返回的元组中有数据说明是闭包,谁的生命周期被延长就打印谁"""
tup = func.__closure__
print(tup)
先获取第一个单元格 cell_contents获取对象中的内容
func1 = tup[0].cell_contents
print("<11111>")
"""打印闭包函数didi_hobby中,生命周期被延长的属性"""
print(func1.__closure__[0].cell_contents)
func1()
在获取第二个单元格 cell_contents获取对象中的内容
func2 = tup[1].cell_contents
print("<22222>")
"""打印闭包函数gege_hobby中,生命周期被延长的属性"""
print(func2.__closure__[0].cell_contents)
func2()
4.闭包的特点
1 # ### 闭包特点 2 """ 3 特点:在闭包函数中,内函数使用了外函数的局部变量, 4 该变量会与内函数发生绑定,延长该变量的生命周期, 5 持续到脚本执行结束. 6 """ 7 def outer(val): 8 def inner(num): 9 return val + num 10 return inner 11 12 func = outer(10) 13 res = func(15) 14 print(res) 15 16 17 # ### 闭包的意义 18 """全局变量的作用域大,容易被篡改""" 19 num = 0 20 def click_num(): 21 global num 22 num += 1 # num = num + 1 23 print(num) 24 click_num() 25 click_num() 26 click_num() 27 num = 100 28 click_num() 29 click_num() 30 31 # 改造,用闭包来实现 32 """ 33 闭包的意义: 34 闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问. 35 """ 36 def outer(): 37 x = 0 38 def click_num(): 39 nonlocal x 40 x += 1 41 print(x) 42 return click_num 43 44 click_num = outer() 45 click_num() 46 click_num() 47 click_num() 48 x = 100 49 click_num() 50 click_num()