不装了,服了,来个大神看看怎么回事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