一、闭包
1、什么是闭包
一个函数A(外函数)在内部定义了函数B(内函数),内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用
闭包格式示例:
def outer(): #外函数
a="吾是临时变量!" #临时变量
def inner(): #内函数
print("引用外函数的临时变量------>",a) #引用外函数的临时变量
return inner # 外函数的返回值是内函数的引用
2、闭包有什么用
a.闭包就是为了不动原函数里面的代码,还要给它增加‘功能’的一种手段。
b.通过外面的一层层的函数传递的参数,让最内层的函数可以直接调用外层函数所有参数,从而实现不动原函数的代码,增加新功能的办法。
3、为什么要用闭包
在企业中已经上线或被使用的程序不允许大批量的修改源代码,说白了就是修改是封闭的,扩展是开放的。装饰器就是为了给某程序增添功能而生的!这个时候装饰器就显得由为重要。
二、装饰器是闭包最好的体现
1、装饰器是如何实现的
调用函数时发现函数上有语法糖@XXX,执行函数XXX(装饰器)内容,通过XXX(YYY)中的形参YYY传递源函数,再向下执行
2、示例展示装饰器的作用
示例1:
给源函数添加功能:打印中文的“我爱你!“
def Add_Fun(fun): #fun为形参,代表传递进来的源函数
def Say(): #内函数
fun() #运行源函数
print("我爱你!") #添加的功能
fun() #运行源函数
return Say #返回函数对象
@Add_Fun #语法糖
def Test(): #源函数
print('I LOVE U !')
Test() #调用源函数
运行结果:
I LOVE U !
我爱你!
I LOVE U !
示例2:
关于接受多个参数和关键字参数——(*args, ** kwargs)
def Add_Fun(fun): #fun为形参,代表传递进来的源函数
def Say(*args,**kwargs): #内函数
print(args)
print(*args)
fun(*args,**kwargs)
return Say
@Add_Fun
def Test(say1,say2,*args,**kwargs):
print(say1)
print(say2)
Test(1,2,'hello') #不会因为参数数量不对报错,并且能接收多个参数
运行结果:
(1, 2, 'hello') #args接收的数以元组储存
1 2 hello #*args接收的所有参数
1
2