【示例】求两点之间的距离(传统方式实现)
import math
def getDis(x1,y1,x2,y2):
return math.sqrt((x1-x2)**2+(y1-y2)**2)
#分别求(1,1)和(2,2)到原点的距离
print(getDis(1,1,0,0))
print(getDis(2,2,0,0))
【示例】求两点之间的距离(闭包方式实现)
import math
#使用闭包求两点之间的距离
def getDisOut(x1, y1):
def getDisIn(x2, y2):
return math.sqrt((x1-x2)**2+(y1-y2)**2)
return getDisIn
#求(1, 1)距离原点(0, 0)的距离
#调用外部函数
getDisIn = getDisOut(0,0)
result = getDisIn(1, 1)
print('(1, 1)距离(0, 0)的距离', result)
#求(2, 2)距离原点(0, 0)的距离
result = getDisIn(2, 2)
print('(2, 2)距离(0, 0)的距离', result)
闭包的特殊用途,可以在不修改源码的前提下,添加新的功能。
【示例】添加日志功能
#闭包的特殊用途:不修改源代码的前提下, 添加新功能
#添加日志输出信息
import time
def writeLog(func):
try:
file = open('writeLog.txt', 'a', encoding='utf-8')
#向文件中写入日志信息(访问:方法名,时间:XXXX-XX-XX)
file.write('访问:')
file.write(func.__name__)
file.write('\t')
file.write('时间:')
file.write(time.asctime())
file.write('\n')
except Exception as e:
print(e.args)
finally:
file.close()
def fun1():
writeLog(fun1)
print('功能1')
def fun2():
writeLog(fun2)
print('功能2')
fun1()
fun2()
【示例】不修改源代码前提下添加日志功能
#闭包的特殊用途:不修改源代码的前提下, 添加新功能
#添加日志输出信息
import time
def writeLog(func):
try:
file = open('writeLog.txt', 'a', encoding='utf-8')
#向文件中写入日志信息(访问:方法名,时间:XXXX-XX-XX)
file.write('访问:')
file.write(func.__name__)
file.write('\t')
file.write('时间:')
file.write(time.asctime())
file.write('\n')
except Exception as e:
print(e.args)
finally:
file.close()
def fun1():
#writeLog(fun1)
print('功能1')
def fun2():
#writeLog(fun2)
print('功能2')
#使用闭包,不修改fun1和fun2的功能代码,添加日志信息
def funcOut(func):
def funcIn():
writeLog(func)
func()
return funcIn
function1 = funcOut(fun1)
function1()
function2 = funcOut(fun2)
function2()
执行结果:
writeLog.txt 文件内容:
终端执行结果: