Java教程

闭包函数

本文主要是介绍闭包函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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()

 

这篇关于闭包函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!