1.计算一个程序执行需要多长时间
1 import time
2 #time.time() 1970纪元后经过的浮点秒数
3 #time.sleep(10) 让程序执行到这个位置的时候停一会儿
4
5 def func():
6 start = time.time()
7 print('测试程序的执行时间为多少')
8 end = time.time()
9 res = end - start
10 print(res)
11 func()
为了更好的调用
1 import time
2
3 def timeer(f):
4 start = time.time()
5 f()
6 end = time.time()
7 res = end - start
8 print(res)
9
10
11 def func():
12 time.sleep(0.01) #为了更精准的测出时间
13 print('测试程序的执行时间为多少')
14
15 timeer(func)
改进
1 import time
2
3 def func():
4 time.sleep(0.01)
5 print('测试软件')
6
7 def timmer(f): #装饰器函数
8 def inner():
9 start = time.time()
10 f() #被装饰的函数
11 end = time.time()
12 print(end - start)
13 return inner #切记这个地方传的是内部函数的名字,不是inner()
14
15
16 func = timmer(func)
17 func()
#不想修改函数的调用方式 但是还想在原来的函数前后添加功能
#timmer就是一个装饰器函数只是对一个函数有一些装饰作用

通过闭包函数返回内部函数的名字,然后在外部接收它,让外部接收的变量与外部的函数保持一致,
然后函数名加上括号就会自动的去调用内部的函数
3.开放封闭原则
开放:对扩展是开放的
封闭:对修改时封闭的
1 import time
2
3 def timmer(f): #装饰器函数
4 def inner():
5 start = time.time()
6 f() #被装饰的函数
7 end = time.time()
8 print(end - start)
9 return inner #切记这个地方传的是内部函数的名字,不是inner()
10
11 @timmer #语法糖:紧贴着被装饰函数上一行放 @装饰器函数名
12 def func():
13 time.sleep(0.01)
14 print('测试软件')
15
16 def func1():
17 time.sleep(2)
18 print('测试')
19
20 func()
21 func1()
当func()有返回值时
1 import time
2
3 def timmer(f): #装饰器函数
4 def inner():
5 start = time.time()
6 f() #被装饰的函数
7 end = time.time()
8 print(end - start)
9 return inner #切记这个地方传的是内部函数的名字,不是inner()
10
11 @timmer #语法糖:紧贴着被装饰函数上一行放 @装饰器函数名
12 def func():
13 time.sleep(0.01)
14 print('测试软件')
15 return '测试软件'
16
17 ret = func()
18 print(ret) #这样子,我们返回的结果并没有值,因为此时的func指向的
19 #是inner函数
改进
1 import time
2
3 def timmer(f): #装饰器函数
4 def inner():
5 start = time.time()
6 ret = f() #被装饰的函数
7 end = time.time()
8 print(end - start)
9 return ret
10 return inner #切记这个地方传的是内部函数的名字,不是inner()
11
12 @timmer #语法糖:紧贴着被装饰函数上一行放 @装饰器函数名
13 def func():
14 time.sleep(0.01)
15 print('测试软件')
16 return '测试软件'
17
18 ret = func()
19 print(ret) #现在这样子就解决了返回值的问题了
当被调函数含有参数的时候
1 import time
2
3 def timmer(f): #装饰器函数
4 def inner(a):
5 start = time.time()
6 ret = f(a) #被装饰的函数
7 end = time.time()
8 print(end - start)
9 return ret
10 return inner #切记这个地方传的是内部函数的名字,不是inner()
11
12 @timmer #语法糖:紧贴着被装饰函数上一行放 @装饰器函数名
13 def func(a):
14 time.sleep(0.01)
15 print('测试软件',a)
16 return '测试软件'
17
18 ret = func(1)
19 print(ret) #当有特殊需求时,可以将inner后参数设成*args或**kwargs
装饰器的固定模式
1 def wrapper(f):
2 def inner(*args,**kwargs):
3 '''
4 这里加被装饰函数执行前的代码
5 '''
6 ret = f(*args,**kwargs)
7 '''
8 这里加被装饰函数执行后的代码
9 '''
10 return ret
11 return inner
12
13 #调用
14 @wrapper