Python装饰器,闭包(Pyday16)
1.闭包:
1 def outer(): 2 x=10 3 def inner():#inner()局部变量,全局无法调用,条件1.inner是内部函数 4 print(x)#条件2.调用外部变量x 5 return inner 6 outer()()#结果是10
2.装饰器:
# 首先说一下装饰器的用处,其实就是给一个函数添加额外的功能,而且的话不影响函数调用方式,对这个装饰器就是这么的强。
# 这个以后一定要多多的使用,可以节省很多的代码,以及性能的优化,以前一直没有注意,这么好的用法,很气呀!
# 下面就开始代码的回顾。
》1.第一种方法
def show_time(func): print('执行show_time函数') def pull(): start_time = time.time() func() # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包! end_time = time.time() print('take time is %s' % (end_time-start_time)) # take time is 3.000788927078247 return pull
》 2.而现在有个拓展的业务,加上一个time.sleep(3)停留3秒钟的功能,但是又不能改人家前端的调用foo()函数的方式
所以就有了这个装饰器的用法,简直就是一个福利,下面使用闭包做的
def show_time(func): print('执行show_time函数') def pull(): start_time = time.time() func() # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包! end_time = time.time() print('take time is %s' % (end_time-start_time)) # take time is 3.000788927078247 return pull def foo(): print('这是我添加的一个装饰器') time.sleep(3) foo = show_time(foo) foo()
》 3.另一种高大上的做法(和上面是一样的只是用了一个Python(@)内置的函数)就是用到了装饰器的方法! ***重点!
def show_time(func): print('执行show_time函数') def pull(): start_time = time.time() func() # 这个地方就是一个闭包,里面的函数可以调用外层函数的参数,这就是闭包! end_time = time.time() print('take time is %s' % (end_time-start_time)) # take time is 3.000788927078247 return pull # 下面就是比较牛逼的装饰器代码了! @show_time # @show_time相当于foo = show_time(foo) def foo(): print('这是我添加的一个装饰器') time.sleep(3) foo() # 这上面的代码的意思和上面的作用是一样的,这就是传说中的装饰器,
3.功能函数加参数:
1 def show_time(f):#f是外部作用变量 2 def inner(*a,**b):#内部函数 3 start=time.time() 4 f(*a,**b) 5 end=time.time() 6 print('time is %s' % (end - start)) # 结果是time is 2.000277519226074 7 return inner 8 @show_time #就相当于foo=show_time(foo) 9 def foo(x,y): 10 print(x+y) 11 time.sleep(2) 12 print('计算差值是') 13 foo(2,3)#5计算差值是time is 2.000110387802124
》1.升级一下
1 @show_time 2 def foo(*args,**kwargs):#可以随意的加变量没有限制 3 sum=0 4 for i in args: 5 sum+=i 6 print(sum) 7 foo(1,2,3,4,44,6)
其中*args代表着任意的字符,且数目任意,*kwargs是通过键值对的形式输出数据,
4.装饰器函数加参数:
1 def logger(flag): 2 def show_time(f):#f是外部作用变量 3 def inner(*a,**b):#内部函数 4 start=time.time() 5 f(*a,**b) 6 end=time.time() 7 print('time is %s' % (end - start)) # 结果是time is 2.000277519226074 8 if flag=='true': 9 print('实现在装饰器里加参数了') 10 return inner 11 return logger 12 @logger('true')#就相当于#show_time其实就是加一个变量,所以才套了一个函数 13 def foo(*args,**kwargs):#可以随意的加变量没有限制 14 sum=0 15 for i in args: 16 sum+=i 17 print(sum) 18 foo(1)
你迷茫只是因为你太low

浙公网安备 33010602011771号