装饰器作业
- 通过装饰器计算函数的运行时间
import time
def time_span(fun) :
def wrapper(*args, **kwargs) :
time_start = time.time()
fun(*args, **kwargs)
end_time = time.time()
time_take = (end_time - time_start)
print('{}函数共花费{}毫秒时间'.format(fun.__name__, time_take))
return wrapper
@time_span
def mi(x, n) :
# time.sleep(3)
if n == 0 or x == 1 :
return 1
if x == 0 :
return 0
return mi(x, n - 1) * x
f = mi
f(3, 12)
- 运行后有错误(如下), 没找到错误的解决方法,单独测试mi()函数又没有错。。。
return mi(x, n - 1) * x
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
mi函数共花费1.1920928955078125e-06毫秒时间
- 在网上查看了一下关于递归函数的装饰器,都有上面类似的问题,处理的方法是在递归函数外面加一层普通函数,我试着修改一下上面的代码,如下:
import time
def time_span(fun) :
def wrapper(*args, **kwargs) :
time_start = time.time()
fun(*args, **kwargs)
end_time = time.time()
time_take = (end_time - time_start)
print('{}函数共花费{:.06f}毫秒时间'.format(fun.__name__, time_take))
return wrapper
@time_span
def _mi(x,n):
def mi(x, n) :
#time.sleep(0.1)
if n == 0 :
return 1
if x == 0 :
return 0
return mi(x, n - 1) * x
return mi(x,n)
if __name__ == '__main__':
_mi(4,20)
- 发现的确不报错了,但是返回这个:
_mi函数共花费0.000000毫秒时间 Process finished with exit code 0
这就不好解释了。网上给出的这种方法测试也是没话费时间。。。,继续研究