定义装饰器函数,用它来生成一个在原函数基础上添加新功能的函数,代替原函数。
例如:用函数装饰器计算斐波那契数列:
初始写法:
def fibonacci1(n, catch=None):
if catch is None:
catch = {}
if n in catch:
return catch[n]
if n <= 1:
return 1
catch[n] = fibonacci1(n-1, catch) + fibonacci1(n-2, catch)
return catch[n]
# print(fibonacci1(50))
运用函数装饰器:
def memo(func):
catch = {} #闭包不会消失
def wrap(*args):
if args not in catch:
catch[args] = func(*args)
return catch[args]
return wrap
@memo
def fibonacci(n):
if n <= 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
# fibonacci = memo(fibonacci) #@memo等价于这句
# print(fibonacci(50))