• Switch
    2018-08-05
    timeer(i_can_sleep())应改为timeer(i_can_sleep)吧,
    传递的应该是函数,而不是返回值

    作者回复: 是的应该为i_can_sleep函数名,感谢指正🙏

    
     5
  • 倡印
    2019-12-23
    这里为什么要用闭包形式写 ? 直接函数写不行吗?

    作者回复: 不行,实现装饰器必须要引入闭包这个功能(概念),装饰器实际是 外部函数名=外部函数名(内部函数名), 在外部函数的定义过程,内部函数必须在内存中装饰器才成立

    
    
  • 锅ke24
    2019-11-06
    老师您好,请问一个问题,下面这种调用,为何会输出两次时间?
    import time

    def timmer(func):
        def wrapper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("运行时间是 %s 秒 " % (stop_time - start_time))
        return wrapper

    @timmer
    def i_can_sleep():
        time.sleep(3)

    num = timmer(i_can_sleep)
    num()
    展开

    作者回复: @timmer 执行了一次,timmer(i_can_sleep) 又执行了一次。 装饰器体现的是“定义时”装饰,不是“运行时”装饰。这个方面要多理解一下。

    
    
  • molly
    2019-08-04
    尹老师,我不明白,为什么stop_time可以减start_time呢?他们都是time.time(),是中间加了一个sleep函数time.time()的值就变啦吗?

    作者回复: stop_time和start_time都是一个时间戳,也就是执行那一刻记录了当前时间;sleep之后时间发生了改变,这里的减法就是统计时间变化的

    
    
  • 摇之
    2018-12-15
    有两个问题我不太明白,统计程序运行时使用的时间不是用clock()函数嘛?wrapper()这个函数是不是装饰器固定的写法?

    作者回复: 函数名字不是固定的,但是这种调用方法是固定的

    
    
  • 赵赵
    2018-10-10
    老师闭包改成lambda的形式后,外层函数不是还有返回内部函数名字,传什么名字,都没定义内部函数的名字

    作者回复: 把lamda表达式整个通过return返回
    如:
    def a_line(a,b):
        return lambda x: a*x+b

     1
    
  • 💭Jun💭
    2018-07-03
    老师您好,我想请问一下,按照您的方法写:
    import time

    def tim(func):
        def wrapper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("程序运行了 %s 秒" % (stop_time - start_time))
        return wrapper()

    @tim
    def time_time_time():
        time.sleep(1)


    tim(time_time_time())

    这种情况写的时候可以成功显示打印出来的语句,但是会出现报错情况,错误代码为:
       tim(time_time_time())
    TypeError: 'NoneType' object is not callable,我查了一下是说这不是一个可调用(callable)类型
    而将tim(time_time_time()) ,这句注释后却显示正常无报错,请问一下是什么原因?谢谢
    展开

    作者回复: 装饰器函数的return处有错误,需要重新理解闭包的概念

    
    
我们在线,来聊聊吧