闭包:本质就是函数
创建闭包:
1.嵌套函数定义(外部函数,内部函数)
2.内部函数使用外部函数中定义的变量,如果要在内部函数中改变外部函数变量,需要先对外部变量进行声明,声明使用nonlocal
例: nonlacal num1
num1+=1
3.外部函数一定要是有返回值,返回内部函数名。
from math import sqrt
import time
#使用传统的函数计算两个点之间的距离。
def function(a,b):
return sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)
def funcOut(a):
def funcIn(b):
return sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)
return funcIn
#分别计算(1,3),(4,8)到原点的距离
a=(0,0)
b=(1,3)
c=(4,8)
dis1=function(a,b) #使用常规函数
dis2=function(a,c) #使用常规函数
f=funcOut(a) #使用闭包函数
dis3=f(b)
dis4=f(c)
print(dis1,dis2)
print('------------------------------')
print(dis3,dis4)
闭包的一个特殊功能:
开闭原则:对添加功能开放,对修改功能关闭
1.在不修改源码的基础上,增加新的功能
#不修改源码的基础上,添加功能,例如:增加日志文件
def fun1():
write_log(fun1)
print('实现fun1的功能。')
def fun2():
write_log(fun2)
print('实现fun2的功能。')
def write_log(func):
with open('log.txt','a',encoding='utf-8') as f:
f.write(func.__name__)
f.write('\t')
#写入访问时间
strtime=time.asctime()
f.write(strtime)
f.write('\n')
def funcOut(fun):
def funIn():
#添加新增功能,
write_log(fun)
fun()
return funIn
if __name__ == '__main__':
fun1=funcOut(fun1)
fun1()
fun2=funcOut(fun2)
fun2()