python代码:实现一个装饰器,调用斐波那契数列函数,在函数调用前后 输出开始“函数名”和结束“函数名”,并输出函数执行时间
时间: 2023-09-07 10:05:07 浏览: 91
### 回答1:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
def timeit(func):
import time
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("开始执行函数:{}".format(func.__name__))
print("函数执行时间:{}".format(end_time - start_time))
print("结束执行函数:{}".format(func.__name__))
return result
return wrapper
@timeit
def fibonacci_wrapper(n):
return fibonacci(n)
fibonacci_wrapper(10)
### 回答2:
下面是一个使用装饰器实现的斐波那契数列函数的例子:
```python
import time
# 定义装饰器函数
def print_time(func):
def wrapper(*args, **kwargs):
start_time = time.time() # 记录函数开始时间
print("开始 {}".format(func.__name__)) # 输出函数名
result = func(*args, **kwargs) # 调用被装饰的函数
end_time = time.time() # 记录函数结束时间
print("结束 {},执行时间为:{} 秒".format(func.__name__, end_time - start_time)) # 输出函数名和执行时间
return result # 返回被装饰函数的结果
return wrapper
# 使用装饰器装饰斐波那契数列函数
@print_time
def fibonacci(n):
if n <= 0:
return None
if n <= 2:
return [1] * n
result = [1, 1]
for i in range(2, n):
result.append(result[i-1] + result[i-2])
return result
# 调用斐波那契数列函数
fibonacci(10)
```
运行上述代码后,将会输出以下结果:
开始 fibonacci
结束 fibonacci,执行时间为:3.0994415283203125e-05 秒
可以看到,装饰器函数成功地在函数调用前后输出了开始和结束的提示,并输出了函数执行的时间。
### 回答3:
下面是实现该功能的装饰器代码:
```python
import functools
import time
def timer_decorator(func):
@functools.wraps(func) # 保留被装饰函数的元信息
def wrapper(*args, **kwargs):
print(f"开始 {func.__name__}")
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"结束 {func.__name__}")
print(f"函数执行时间:{end_time - start_time}秒")
return result
return wrapper
@timer_decorator
def fibonacci(n):
if n <= 0:
return None
if n == 1 or n == 2:
return 1
a, b = 1, 1
for _ in range(3, n+1):
a, b = b, a + b
return b
```
以上代码定义了一个装饰器`timer_decorator`,该装饰器接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数中,首先打印“开始函数名”,然后记录函数开始时间。接着调用被装饰的函数,并记录函数结束时间。最后打印“结束函数名”和函数执行时间,并返回被装饰函数的返回值。
使用`@timer_decorator`装饰器将斐波那契数列函数`fibonacci`进行装饰,即可在函数调用前后输出开始“函数名”和结束“函数名”,并输出函数执行时间。
例如,调用`fibonacci(10)`时输出如下:
```plain
开始 fibonacci
结束 fibonacci
函数执行时间:2.1457672119140625e-05秒
```
注意,装饰器需要使用`@functools.wraps(func)`来保留被装饰函数的元信息,使得被装饰函数在使用`help()`等函数时能够正确显示函数信息。
阅读全文