首页 > 编程语言 >【Python-装饰器】无参数简易装饰器示例合集

【Python-装饰器】无参数简易装饰器示例合集

时间:2023-09-05 14:44:06浏览次数:40  
标签:return 示例 Python args result func kwargs 装饰 def

无参数装饰器案例

​ 一些简易的不携带参数的装饰器合集,用于学习和巩固装饰器方面的知识,配合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

相关文章

  • 将Python深度神经网络转换成C++
     项目方案:将Python深度神经网络转换成C++项目概述本项目旨在将使用Python编写的深度神经网络模型转换为C代码,以便在C环境中部署和运行。通过将模型从Python转换为C++,可以提高模型的性能和效率,并扩展模型在不同平台和设备上的应用。技术方案1.选择转换工具我们可以使用以下两种......
  • python 图片插入表格
    图片插入表格自动化媲美vbaimportosfromPILimportImagefromdocximportDocumentfromdocx.sharedimportInches#创建空白的Word文档doc=Document()#获取所有图片文件路径image_folder=r"E:\东\全部二维码-------11"image_files=[os.path.join(imag......
  • python 组件安装
    1.cx_oracle安装 步骤1:下载组件(cx_Oracle-8.1.0-cp38-cp38-win_amd64.whl)后,放置...Python\Python38\Lib\site-packages目录下,如D:\Programs\Python\Python38\Lib\site-packages 步骤2:CMD,CD至site-packages目录后,执行命令:pipinstall组件名称,如pipinstallcx_Oracle-8.1......
  • python request上传多个文件和其他字段
    使用 requests 库可以方便地上传多个文件和其他字段。当使用Python的requests.post函数时,您可以在其中添加异常处理来捕获可能的网络错误或HTTP错误。 importrequestsurl='http://cbim.com/upload'files={'file1':('file1.txt',open('file1.txt','rb'),'tex......
  • nginx负载均衡结构示例
    Linux系统-部署-运维系列导航 使用说明nginx负载均衡需要使用stream模块,支持HTTP与TCP服务。此处仅说明负载均衡的配置结构,具体参数请自行查阅相关资料。 Nginx负载均衡策略nginx自有策略轮询(默认)权重(weight)IP地址哈希(ip_hash)最小连接数(least_conn......
  • 不错的python爬虫框架
    ECommerceCrawlers准确来说,这不是一个开发的框架,而是一宗几十个“爬虫代码”的汇总,请大家用于学习和研究。多种电商商品数据......
  • 【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
    大家都知道我主业是个运维开发(或者算法工程师),每天时间不多,但我又想做自媒体。然后呢,我就想了个方案,每天起来之后写个短视频的脚本,包含一系列图片和文字,然后上班的时候给它提交到流水线上跑,下班之前就能拿到视频,然后往各大平台上一传,是不是挺美滋滋的。我和我之前的合伙人一说,他就......
  • python版本升级
    https://zhuanlan.zhihu.com/p/439552243CentOS7中默认安装了Python,版本比较低(2.7.5),为了使用python3.7.8,需要对旧版本进行升级。由于很多基本的命令、软件包都依赖旧版本,比如:yum。所以,在更新Python时,建议不要删除旧版本(新旧版本可以共存)。一、查看当前python版本[root@l......
  • python 学习过程1
    第一天可以用加号连接字符串:利用反斜杠闭合单引号防止和后面的单引号闭合导语句错误。变量赋值之后,重复利用:先用greet(招呼)作为变量,然后你好吃了么作为赋值这里保留了中文打招呼和英文打招呼目的就是为了防止赋值丢失变量取名规则:文字、数字、下划线组成。(zhang_3)不能有下划线之外......
  • python的dict和json数据的区别
    python的dict和json数据有什么区别?-知乎(zhihu.com)python字典与json的区别_python字典与json的区别_阿君聊风控的博客-CSDN博客expectedpropertynameor'}'injsonatposition1遇到如上报错几次,因为没弄清dict和json的区别1、dict是数据结构,json是数据格式,一般用于......