要实现的功能:
写一个函数,计算1-100的和,用递归完成;再自定义装饰器,能够计算出递归函数执行的时间
🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓🍉🍓
在未使用函数嵌套前的源代码:
a=0
import datetime
def outer(func1):
def inner(n):
starttime = datetime.datetime.now()
func1(n)
endtime = datetime.datetime.now()
long = endtime - starttime
print(f"运行的时长是{long}")
return func1
return inner
@outer
def sum_sum(n):
global a
if n>0:
a+=n
return sum_sum(n-1)
else:
print("1-100的和是%s"%a)
sum_sum(100)
执行结果:
1-100的和是5050
运行的时长是0:00:00
运行的时长是0:00:00
运行的时长是0:00:00
运行的时长是0:00:00
运行的时长是0:00:00
·
·
·
错因分析:
由于内层函数是递归函数,函数每递归一次便会对装饰器运行一次。
思路进阶:
目标----->内层函数在递归时不会执行外层函数。解决办法------->将内层函数嵌套到一个函数中。当调用这个函数时,内层函数执行完成后才会结束这个函数的运行,不会对外层函数产生干扰,达到统计程序运行时间的目的。
修改后的源代码:
import datetime
def outer(func1):
def inner(n):
starttime = datetime.datetime.now()
func1(n)
endtime = datetime.datetime.now()
long = endtime - starttime
print(f"运行的时长是{long}")
return func1
return inner
@outer
def sum_sum(n):
a=0
def sum(n):
nonlocal a
if n>0:
a+=n
return sum(n-1)
else:
print("1-100的和是%s"%a)
return sum(n)
sum_sum(100)
执行结果:
1-100的和是5050
运行的时长是0:00:00