什么是闭包?
闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)
在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如何创建闭包?
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()