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

浙公网安备 33010602011771号