#定义个简单的函数
import time
def f():
print('hello')
time.sleep(1)
print('world')
#现在想增加这个函数的功能,比如统计一下运行时间,一种方案是直接修改该函数
def f():
start_time = time.time()
print('hello')
time.sleep(1)
print('world')
end_time = time.time()
print('程序运行时间为:%s' %(end_time-start_time))
f()
#这种方法破坏了函数的封闭性,可以考虑把f这个函数作为参数传入另外一个函数run_time,在run_time里运行函数f并统计时间
def f():
print('hello')
time.sleep(1)
print('world')
def run_time(f):
start_time = time.time()
f()
end_time = time.time()
print('程序运行时间为:%s' %(end_time-start_time))
run_time(f)
#该例说明在python中,函数名可以作为另外一个函数的参数进行传递
#此时,可以用装饰器来完成该功能
def run_time(f):
def wrapper():
start_time = time.time()
f()
end_time = time.time()
print('程序运行时间为:%s' %(end_time-start_time))
return wrapper
@run_time
def f():
print('hello')
time.sleep(1)
print('world')
f()
装饰器与函数名传参比较的优点为:只需要知道有f这方法,并执行f()来运行即可通过装饰器自动扩展函数的功能,用户不需要知道还有一个run_time方法,比较符合函数调用的习惯。