【发布时间】:2021-02-26 17:09:33
【问题描述】:
我试图理解一个使用装饰器存储已计算数字值的斐波那契数列示例。比如fib(5)会被计算,当我们到fib(6)时,它就不会再计算fib(5)了……
我有点了解装饰器,但有些事情让我感到困惑。我对下面的代码有几个问题。
from functools import wraps
def dec(func):
values = {}
@wraps(func)
def wrap(*args):
if args not in values:
values[args] = func(*args)
return values[args]
return wrap
@dec
def fib(n):
if n <= 2:
return 1
else:
return fib(n - 1) + fib(n - 2)
- 为什么在
wrap()中使用*args?它不应该只取一个数字 n 并检查它的值是否在字典中吗?为什么args在某些地方用*调用,而在某些地方没有*? - 当函数
fib被递归调用时会发生什么(装饰器函数的行为方式)。我首先认为它在每次递归期间都会进入该函数,但这是不对的,因为值字典会重置?那么它是否只输入了wrap()函数? - 为什么最后会返回 wrap?
【问题讨论】:
标签: python recursion decorator python-decorators functools