gpt4 book ai didi

python - 关于装饰器函数的一些事情

转载 作者:行者123 更新时间:2023-12-05 06:09:21 24 4
gpt4 key购买 nike

我正在尝试理解斐波那契数列的示例,该示例使用装饰器来存储已计算数字的值。例如 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)
  1. 为什么 *args 用于 wrap()?难道不应该只取一个数字 n 并检查它的值是否在字典中吗?为什么 args 在某些地方调用 with,而在某些地方不调用 *
  2. 当函数 fib 被递归调用时会发生什么(装饰函数的行为如何)。我首先认为它在每次递归期间都会进入该函数,但这不对,因为值字典会重置?那么它是否只进入 wrap() 函数?
  3. 为什么最后返回换行?

最佳答案

1- 你完全正确。不需要“*”,因为您只检查传递给函数的值。所以简单地称之为“n”。

2-首先让我们弄清楚什么是标签“fib”,在它上面使用了“@dec”之后?实际上它现在是装饰器中的内部函数(我的意思是“包装”函数)。为什么 ?因为@dec 实际上是这样做的:

fib = dec(fib)

所以调用了“dec”装饰器,它返回什么? “包装”功能。什么是“换行”功能?这是一个包含“值”字典的闭包。

无论何时调用装饰器,装饰器的主体都只执行一次。所以只有一个“值”字典。在执行“dec”装饰器的主体期间还会发生什么?只是返回对“wrap”函数的引用。就是这样。

现在,当您调用“fib”函数(最初是“wrap”函数)时,此闭包正常运行,因为它只是一个递归函数,除了它具有额外的缓存功能。

3- 因为你需要有内部函数的句柄(这里是“wrap”函数)。您想稍后调用它以计算 Fibonacci。

关于python - 关于装饰器函数的一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64842150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com