V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
juoyi
V2EX  ›  问与答

问个小白问题,如何实现一个装饰器用来统计阶乘的运行时间?有些搞不懂

  •  
  •   juoyi · 2018-03-15 20:33:28 +08:00 · 1554 次点击
    这是一个创建于 2450 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最后运行得完全超出预期 import time from functools import wraps

    def timefunc(func):
        """统计一个函数的运行时间"""
        @wraps(func)
        def wrapper(*args, **kwargs):
            print('-------函数开始执行--------')
            start_time = time.time()  # 记录起始时间
            func(*args, **kwargs)  # 调用被装饰函数
            end_time = time.time()  # 记录结束时间
            run_time = end_time - start_time
            print("function %s runtime is %s " % (func.__name__, run_time))
            print('-------函数结束执行--------')
    
        return wrapper
    
    
    @timefunc
    def factorial(num):
        """计算一个正整数的阶乘"""
        if not isinstance(num, int):
            raise TypeError("参数必须为整型!")
        elif num <= 0:
            raise ValueError("请输入正整数!")
        elif num == 1:
            return 1
        else:
            return num * factorial(num-1)
    
    
    if __name__ == '__main__':
        factorial(4)
    
    4 条回复    2018-03-16 02:08:00 +08:00
    kkzxak47
        1
    kkzxak47  
       2018-03-15 20:42:06 +08:00 via Android
    你先问怎么实现,然后把实现贴出来了。请问,你在问什么?
    juoyi
        2
    juoyi  
    OP
       2018-03-15 20:44:19 +08:00
    @kkzxak47 没有啊,我以为自己懂了,自己实现了一下,结果还是报错,自己看了半天不知道具体是哪块逻辑有问题
    zhzy
        3
    zhzy  
       2018-03-15 22:05:45 +08:00 via iPhone
    请善用搜索: http://bfy.tw/H7vO
    Arthur2e5
        4
    Arthur2e5  
       2018-03-16 02:08:00 +08:00 via Android
    https://stackoverflow.com/questions/43432956/how-a-decorator-works-when-the-argument-is-recursive-function

    一模一样,人还知道至少要用一个更靠谱的计时呢
    你不要直接包,等到最后再用 timefunc(factorial)(4) 之类的只包一次就是了…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3303 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:33 · PVG 20:33 · LAX 04:33 · JFK 07:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.