Python递归的问题?

发布于 2022-09-04 21:50:47 字数 1327 浏览 14 评论 0

import time

def outer(F):
    def wrapper(x):
        start = time.time()
        F(x)
        end = time.time()
        print(end - start)
    return wrapper


@outer
def func2(a):
    if a == 1:
        return 1
    else:
        return a * func2(a-1)




func2(7)

上面是一段python递归实现阶乘的代码,但是在加上装饰器之后就报错了,想请大家看下问题出在哪里?为什么调用的时候不用 @outer这种方式,而用原始的 outer(func2)(7)就没问题了?
报错如下:

[root@yang python]# python3 test.py 
7.152557373046875e-07
Traceback (most recent call last):
  File "test.py", line 22, in <module>
    func2(7)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
  File "test.py", line 6, in wrapper
    F(x)
  File "test.py", line 17, in func2
    return a * func2(a-1)
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

归途 2022-09-11 21:50:47

内层应该有返回值

def outer(F):
    def wrapper(x):
        start = time.time()
        ret=F(x)
        end = time.time()
        print(end - start)
        return ret # 内层应该有返回值        
    return wrapper
>>> func2(7)
0.0
0.015625
0.015625
0.03125
0.03125
0.03125
0.046875
5040
谜泪 2022-09-11 21:50:47

你好,
装饰以前的outer(func2)(7)和装饰以后的func2(7)当然不一样。
outer(func2) = 新的函数。outer只一次运行。
func2(7) = outer(func2(7)) = outer(func2(outer(func2(6))))。。。每一次func2运行,outer也运行。
对不起,我的中文真不好,希望你能明白。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文