无参数装饰器案例
一些简易的不携带参数的装饰器合集,用于学习和巩固装饰器方面的知识,配合vscode的Debug功能或者pythontutor网站的运行流程可视化来查看装饰器的工作原理以及运行时机。
1.计时器装饰器
# 计时器装饰器:用于测量函数执行时间。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.perf_counter() # perf_counter()返回性能计数器的值(以分秒为单位)
result = func(*args, **kwargs)
end_time = time.perf_counter()
execution_time = end_time-start_time
print(f"{func.__name__} 执行时间: {execution_time}秒")
return result
return wrapper
@timer
def my_function():
time.sleep(2)
my_function()
2.日志记录装饰器
# 一个简易的日志记录装饰器,用于记录函数执行信息
def log(func):
def wrapper(*args, **kwargs):
print(f"调用函数{func.__name__},参数:{args},{kwargs}")
result=func(*args, **kwargs)
print(f"函数{func}执行结果:{result}")
return result
return wrapper
@log
def calculate(x,y):
return x+y
calculate(6,9)
3.缓存装饰器:用于缓存函数的结果,提高性能。
# 缓存装饰器:用于缓存函数的结果,提高性能。
def chache(func):
cached_result = {} # k=接收的参数,v为保存的值
def wrapper(*args, **kwargs):
#判断传入的参数是否已经计算过,如果计算过,那么直接返回之前保存过的值即可
if args in cached_result:
return cached_result[args]
result=func(*args, **kwargs)
# 如果是新计算的值,那么就保存到缓存字典中
cached_result[args]=result
return result
return wrapper
@chache
def fibonacci(n):
if n <=1:
return n
return fibonacci(n-1) + fibonacci(n-2)
fibonacci(10)
4.输入验证装饰器,用于验证函数输入的有效性
# 输入验证装饰器: 用于验证函数输入的有效性
def validate_input(func):
def wrapper(*args, **kwargs):
# *args表示不定数量的位置参数。并将它们作为一个元组传递给函数
# **kwargs表示不定数量的关键字参数,并将它们作为一个字典传递给函数
for arg in args:
if not isinstance(arg,int):
return '输入的参数必须为整数'
return func(*args, **kwargs) # 调用被装饰函数,func指向的是multiply这个函数对象
return wrapper
@validate_input
def multiply(a,b):
return a*b
multiply=multiply(10,20)
print(multiply) #Outputs 200
multiply_1=multiply(10,'20')
print(multiply) #Outputs 输入的参数必须为整数
5.函数值打印装饰器:可以省略需要打印函数值的print
# 值打印函数:直接调用函数就可以输出函数的值,不需要再使用print打印
def func_value_print(func):
def wrapper(*args, **kwargs):
print(f'接下来要运行的函数为:{func}')
result = func(*args, **kwargs)
print(f'该函数的运行的值为:{result}')
return wrapper
@func_value_print
def calculate(a,b,c,d):
return (a+b)*(c+d)
calculate(1,1,1,1)
标签:return,示例,Python,args,result,func,kwargs,装饰,def
From: https://www.cnblogs.com/white-kitty/p/17679494.html