什么是闭包?
    闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)
  在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如何创建闭包?
    1.嵌套函数定义(内部函数和外部函数)
    2.内部函数使用外部函数中定义的变量
    3.外部函数一定要有返回值,返回内部函数
如何使用闭包?
    funcIn = funcOut(a)
    print(type(funcIn))
    result = funcIn(b)
    print(result)
闭包,外部函数的变量不会随着外部函数的结束而消失
1 def funcOut(num1):
 2     def funcIn(num2):
 3         #声明以下外部函数变量
 4         nonlocal num1
 5         num1 += 1 #外部函数变量未被声明时,num1仅限使用不能修改
 6         #如果在内部函数中需要修改外部函数中的变量,需要使用nonlocal声明
 7         return num2+num1
 8     return funcIn
 9 a = 10
10 b = 20
11 f = funcOut(a)#funcOut返回的是funcIn,所以f就是funcIn
12 print(type(f))
13 result = f(b)
14 print(result)
15 result = f(100)#闭包,外部函数的变量不会随着外部函数的结束而消失
16 print(result)
求两个点之间的距离
1 import math
 2 #求两个点(x1,y1),(x2,y2)之间的距离
 3 #传统的函数
 4 def getDis(x1,y1,x2,y2):
 5     return math.sqrt((x1-x2)**2 + (y1-y2)**2)
 6 #使用闭包
 7 def getDisOut(x1,y1):
 8     def getDisIn(x2,y2):
 9         return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
10     return getDisIn
11 #分别求点(10,10)(20,20)距离原点(0,0)的距离
12 #普通函数
13 dis = getDis(0,0,10,10)
14 print("(10,10)距离原点的距离为:%g"%dis)
15 dis = getDis(0,0,20,20)
16 print("(20,20)距离原点的距离为:%g"%dis)
17 print('*************************************')
18 #闭包
19 getDisIn = getDisOut(0,0)
20 dis1 = getDisIn(10,10)
21 print("(10,10)距离原点的距离为:%g"%dis1)
22 dis1 = getDisIn(20,20)
23 print("(20,20)距离原点的距离为:%g"%dis1)

闭包的特殊用法

1 # coding='uft-8'
 2 """闭包的特殊用途:
 3     1.可以在不修改现有功能源码的前提下,增加新功能
 4     日志功能(统计访问事件,访问功能,写到日志文件中),权限验证(下载之前验证当前账户是否为会员)
 5     开闭原则:开放:添加功能(可以)
 6             关闭:修改源代码(不可以)
 7 """
 8 import time
 9 #定义一个记录日志的函数:将访问时间和访问的函数名写入文件中(log.txt)
10 def writeLog(func):
11     try:
12         file = open('log.txt','a')
13         #写入相关数据信息(访问的函数名,访问时间)
14         #写入访问的函数名
15         file.write(func.__name__)
16         file.write('\t')
17         #写入访问时间
18         file.write(time.asctime())
19         #换行
20         file.write('\n')
21     except Exception as e:
22         print(e.args)
23     finally:
24         #关闭文件
25         file.close()
26 #闭包
27 def funcOut(func):
28     def funcIn():
29         #新增功能
30         writeLog(func)
31         func()
32     return funcIn
33 
34 
35 def func1():
36     print('我是功能1')
37 def func2():
38     print('我是功能2')
39 
40 #闭包调用
41 func1 = funcOut(func1)
42 func2 = funcOut(func2)
43 
44 func1()
45 func2()