Python 闭包和装饰器
闭包
概念:内部函数对外部函数作用域里变量的引用
-
例子
def fun():#外部函数 a = 1#外部函数作用域里的变量 print('this is func') def func1(num):#内部函数也就是闭包函数 print('this is func1') print(num + a) return func1 var = fun() #此时的 var = func1 var(3) #结果 this is func this is func1 4
闭包存在的意义:
1.闭包内的闭包函数私有化了变量
2.完成了数据的封装,类似于面向对象
-
再来看个例子
mylist = [1,2,3,4,5] def func(obj): print('func:',obj) def func1(): obj[0] += 1 print('func1:',obj) return func1 var = func(mylist) var() var() var() #结果: func:[1,2,3,4,5] func1:[2,2,3,4,5] func1:[3,2,3,4,5] func1:[4,2,3,4,5]
装饰器(也叫做语法糖)
概念:外部函数传入被装饰函数名,内部函数返回装饰函数名。不影响原有函数的功能,还能够添加新的功能。
-
例子
def fun1(func): #外部闭包函数的参数是被装饰的函数对象 def fun2(): print('aaabbb') return func()#返回的是外部函数接收的被装饰函数的调用,也就是返回函数的调用 return fun2 #这个是返回函数对象 @fun1 def myprint(): #myprint传入func print('我是myprint') myprint() #结果 aaabbb 我是myprint
-
过程解析
1.调用myprint ---> 识别到语法糖。
2.将myprint传入func --->也就是 fun1(myprint)() //后面这个括号是语法糖的效果
3.由于遇到return fun2 所以fun1(myprint)()就是 fun2()
4.执行fun2()方法,打印'aaabbb',返回func()
5.前面说过,myprint当做参数传递过去给func,所以func() = myprint()
6.所以执行方法myprint(),打印'我是myprint'
-
再来看个例子
def fun1(func): def fun2(x,y): print(x,y) x += 3 y += 3 return func(x,y) return fun2 @fun1 def mysum(a,b): #a = a + 5 b同理 print(a+b) mysum(1,1) #结果 1 1 8
被装饰的函数带参数,只需要在最内部函数传入参数即可。