标签:函数嵌套 star 代码 修改 理解 效果 python 函数 time()
高阶函数的两种情况:
1、
把一个函数名当成实参传给另外一个函数(在不修改被装饰函数源代码的情况下,为其添加功能)
import time def bar(): time.sleep(2) print(‘in the bar‘) def test1(fun_name): t1 = time.time() fun_name() print(‘run time:%s‘%(time.time()-t1)) test1(bar)
2、
返回值中包含函数名(不修改调用方式)
import time def bar(): time.sleep(2) print(‘in the bar‘) def test1(fun_name): return fun_name bar = test1(bar) bar()
高阶函数+嵌套函数则得到装饰器
import time def timer(fun_name): def deco(): start_time = time.time() fun_name() end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco def bar(): time.sleep(2) print(‘in the bar‘) bar = timer(bar) bar()
但我们一般把装饰器在被装饰函数前面定义,并且用如下的写法代替:
import time def timer(fun_name): def deco(): start_time = time.time() fun_name() # 在这里调用是bar()这个函数 end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco @timer # bar = timer(bar) 这步其实是调用了timer()这个函数,把bar这个函数进行重新定义 def bar(): time.sleep(2) print(‘in the bar‘) bar() # 在调用bar的时候,其实调用的是deco()这个函数
可以理解为,先用第一种高阶函数加上想要的功能,再重新覆盖定义这个函数,再用函数嵌套,就得到了我们想要的装饰器的效果
如果有参数:
import time def timer(fun_name): def deco(*args,**kwargs): start_time = time.time() fun_name(*args,**kwargs) end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco @timer # bar = timer(bar) def bar(): time.sleep(2) print(‘in the bar‘) @timer def bar2(name,age): print(name,age) bar() bar2(‘simon‘,22)
标签:函数嵌套 star 代码 修改 理解 效果 python 函数 time()
原文地址:https://www.cnblogs.com/Simonsun002/p/8747473.html