当前位置: 首页 > 面试题库 >

在python中装饰递归函数

仲孙飞文
2023-03-14
问题内容

我很难理解修饰的递归函数是如何工作的。对于以下代码段:

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传递给包装器时,它将递归调用f(n)。但是包装器本身不是递归的,因此仅打印一个“装饰”。

第三个让我感到困惑,这与使用装饰器@dec相同。为什么修饰的f(n)也调用包装器五次?在我看来,def_f = dec(f)和f =
dec(f)仅仅是绑定到两个相同函数对象的两个关键字。装饰函数的名称与未装饰函数的名称相同时,还会发生其他情况吗?

谢谢!


问题答案:

如您所说,第一个通常被称为。

第二个在全局范围内放置f的修饰版本dec_f。调用Dec_f,以显示“
Decorated!”,但在传递给dec的f函数内部,您调用f本身,而不是dec_f。在全局范围内查找并找到了名称f,在该名称中仍没有包装就对其进行了定义,因此从此以后,仅调用f。

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



 类似资料:
  • 本文向大家介绍Python装饰器结合递归原理解析,包括了Python装饰器结合递归原理解析的使用技巧和注意事项,需要的朋友参考一下 代码如下: 输出如下: start memoize start memoize memorize 10 None memorize 10 None 对比代码(把注释的地方去掉后)的输出: 通过取消注释的对比,可以得到如下结论: 装饰器memoize实际上对于函数nsu

  • 考虑Python中的这个基本递归: 根据斐波那契数列的(n-1)(n-2)函数,这是有道理的。 Python如何执行包含另一个递归的递归,这个递归不在同一代码行内,而是在同一代码行内?“finobacci(number-1)”是否完成所有递归,直到它到达“1”,然后它对“fibonacci(number-2)”做同样的事情,并将它们相加? 作为比较,下面的递归函数将一个数“x”提升为“y”的幂,我

  • 主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面

  • 我试图在Python中做一个函数,它接受树的任意节点,并根据节点给出的列表填充列表。 考虑到以下绘制糟糕的树: 例如,如果我们从节点5开始,我们应该得到: 包含具有相同父节点的所有节点的列表,包括我们从(4和5)开始的节点。 任何子节点,但不是其子节点(6) 父节点和具有相同父节点的任何父节点,以及它们的父节点,等等,直到我们到达根节点,但不包括根节点(在本例中只有2和3个,但如果树更深,我们开始

  • 本文向大家介绍如何在Python中编写递归函数?,包括了如何在Python中编写递归函数?的使用技巧和注意事项,需要的朋友参考一下 一个递归 函数是它的执行过程中调用自身的函数。这使函数可以重复多次,输出结果和每次迭代的结束。递归与无限有关。  下面是一个递归函数示例,用于查找整数的阶乘。 数字的阶乘 是从1到该数字的所有整数的乘积。  例如,阶乘9(表示为9!)为1 * 2 * 3 * 4 *

  • 我在递归地计算一个数的位数和,直到和小于10。例如; 由于最后的数字和是9,那么我们停止。我意识到遵循递归方法,在我的知识中,它工作得很好; 但是,如果我们有类似的情况,正确的输出是1,因为但是我的代码停止在第二个级别,并以我可以得到一些帮助来修改我的第二个代码以解决这个问题吗?提前谢了。