yzs193728 发表于 2023-4-1 20:53:18

Python课后习题加延时装饰器问题

import time
def delay(func):
    def inner():
      start=time.time()
      func()
      stop=time.time()
      time.sleep(1-(stop-start))
    return inner

#以下是题目给定内容
#为什么延时装饰器加在这里不行呢?
def fib():
    back1, back2 = 0, 1
    @delay#添加延时装饰器
    def func():
      nonlocal back1, back2
      back1, back2 = back2, back1 + back2
      print(back1, end=' ')
    return func
   
def get_fib(n):   
    f = fib()
    for i in range(n):
      f()
   
n = int(input("请输入需要获取的斐波那契数:"))
get_fib(n)

sfqxx 发表于 2023-4-1 22:34:52

import time
def delay(func):
    def inner():
      start = time.time()
      func()
      stop = time.time()
      time.sleep(1-(stop-start))
    return inner
def fib():
    back1, back2 = 0, 1
    def func():
      nonlocal back1, back2
      back1, back2 = back2, back1 + back2
      print(back1, end=' ')
    return delay(func)
def get_fib(n):   
    f = fib()
    for i in range(n):
      f()
n = int(input(""))
get_fib(n)

isdkz 发表于 2023-4-1 22:37:10

如果装饰器加在 fib 的话,那么 fib 就会成为装饰器中的 func,也就是实现主要功能的函数

但是 fib 这个函数只是返回 func 而已,而主要功能在 func 那里,他也没有调用 func ,

同时 fib 会成为 inner 的返回值,因为 inner没有返回值,所以返回值为 None,

所以在 f = fib() 中 f 就成了 None,所以后面调用 f 就报错了,因为 None 是不可调用的
页: [1]
查看完整版本: Python课后习题加延时装饰器问题