编程语言
首页 > 编程语言> > 不装了,服了,来个大神看看怎么回事python装饰器加递归!!

不装了,服了,来个大神看看怎么回事python装饰器加递归!!

作者:互联网

以下内容关于python的装饰器和递归!知道哪里有问题,但是却说不清哪里有问题,有没有大神来给讲讲头疼!!

随便写个装饰器函数,注意里面的嵌套函数没有返回值!!
def foo(func):
    def foo1(n):
        x=func(n)
        print(x,n)
    return foo1
-------------------------------------
递归阶乘函数
@foo
def mos(n):
    if n == 1:
        return 1
    return n*mos(n-1)
---------------------------------
以上应该都没有什么问题吧,不要问我为什么装饰器什么用都没有,你就当我想看看这个函数的执行时间。
然后我执行==》mos(3)
会报错:
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'
--------------------------------------------
但是如果我把装饰器函数加上返回值,就会正确输出。
def foo(func):
    def foo1(n):
        x=func(n)
        print(x,n)
        return x#加上返回就会正确输出
    return foo1
------------------------------------------
输出结果:
1 1
2 2
6 3

很明显这个装饰器要正常执行,需要嵌套函数的返回值,但是这就让我觉得有些混乱!!
按照装饰器的相关定义如下:

以上装饰器函数可以写成如下:
mos = foo(mos)
mos(3)
这样下来与装饰器是等效的,执行仍然会出错。
---------------------------------------------
但是如果这样写新定义一个变量:
mo = foo(mos)
mo(3)
运行时没有问题。

装饰器在被装饰函数定义之后立即运行,所以:
mos = foo(mos)===》foo1
mos(3) ===>foo(mos)(3)
这两个mos已经是不同的变量了,看返回结果,是装饰器的内嵌函数执行了三次,内嵌函数的返回值需要参与到运算,这一部分彻底让我晕了,有没有大神给解解惑!!dis模块的反汇编都用上了,实在搞不清楚,为什么必须要有返回值!!!

现在看来最完美的解释就是,return nmos(n-1)已经被替换成nfoo1(n-1)所以装饰器嵌套函数foo1必须要有返回值,可这是怎么做到的!!

标签:不装,return,函数,python,foo1,mos,器加,foo,装饰
来源: https://blog.csdn.net/weixin_43287121/article/details/110092016