gpt4 book ai didi

python - 在python中装饰递归函数

转载 作者:太空狗 更新时间:2023-10-29 20:19:07 24 4
gpt4 key购买 nike

我很难理解装饰递归函数的工作原理。对于以下代码段:

def dec(f):
def wrapper(*argv):
print(argv, 'Decorated!')
return(f(*argv))
return(wrapper)

def f(n):
print(n, 'Original!')
if n == 1: return(1)
else: return(f(n - 1) + n)

print(f(5))
print

dec_f = dec(f)
print(dec_f(5))
print

f = dec(f)
print(f(5))

输出是:

(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15

((5,), 'Decorated!')
(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15

((5,), 'Decorated!')
(5, 'Original!')
((4,), 'Decorated!')
(4, 'Original!')
((3,), 'Decorated!')
(3, 'Original!')
((2,), 'Decorated!')
(2, 'Original!')
((1,), 'Decorated!')
(1, 'Original!')
15

第一个打印 f(n),因此每次递归调用 f(n) 时自然会打印“原始”。

第二个打印 def_f(n),因此当 n 传递给 wrapper 时,它会递归调用 f(n)。但是包装器本身不是递归的,因此只打印了一个“Decorated”。

第三个让我很疑惑,这和使用装饰器@dec是一样的。为什么装饰 f(n) 也调用包装器五次?在我看来 def_f=dec(f) 和 f=dec(f) 只是绑定(bind)到两个相同函数对象的两个关键字。当装饰函数被赋予与未装饰函数相同的名称时,是否发生了其他事情?

谢谢!

最佳答案

正如你所说,第一个像往常一样被调用。

第二个将名为 dec_f 的 f 的修饰版本放入全局范围。 Dec_f 被调用,因此打印“装饰!”,但在传递给 dec 的 f 函数内部,您调用 f 本身,而不是 dec_f。在全局范围内查找并找到名称 f,它仍然在没有包装器的情况下定义,因此从那时起,只有 f 被调用。

在 3re 示例中,您将修饰版本分配给名称 f,因此当在函数 f 内部查找名称 f 时,它会在全局范围内查找,找到 f,它现在是修饰版本。

关于python - 在python中装饰递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757871/

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