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

本文探讨了一个关于Python装饰器和递归函数的困惑。在装饰器内部,由于嵌套函数没有返回值导致调用递归阶乘函数时出现TypeError。通过分析,发现装饰器必须返回嵌套函数的返回值以保持正常执行。当添加返回值后,装饰器功能得以实现。同时,展示了如何等价地手动应用装饰器,并揭示了装饰器在函数定义后立即运行的特性,以及为何需要内嵌函数的返回值。
摘要由CSDN通过智能技术生成

以下内容关于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必须要有返回值,可这是怎么做到的!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~白+黑

真乃人中龙凤,必成大器,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值