首页 > 编程语言 >Python 函数装饰器

Python 函数装饰器

时间:2024-10-31 18:45:16浏览次数:6  
标签:函数 Python func time print 装饰 def

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。

首先,简单举个例子:

函数参数传递:

import time
def square(x):
     return x * x


def print_running(f, x):
     print(f"{f.__name__} 正在运行")
     return f(x)

result = print_running(square, 2)
print(result)

说明了函数也可以作为参数进行传递

再看下一个例子:

无参装饰器

# def decorator(func):
#     def wrapper(*args, **kwargs):
# #打印函数正在运行的消息
#         print(f"{func.__name__} is running.")
# #记录函数开始执行的时间
#         start_time = time.time()
# #调用原始函数,并传递所有接收到的参数
#         result = func(*args, **kwargs)
# #记录函数结束执行的时间
#         end_time = time.time()
# #打印函数执行所花费的时间
#         print(f"{func.__name__} 执行时间:{end_time - start_time}")
# #返回原始函数的执行结果
#         return result
# #返回包装函数,它将替代原始函数被调用
#     return wrapper

这相当于一个简单的装饰器,对你需要进行修改的函数进行加工

先测试一下不加装饰器的函数情况:

def ceshi():
    print("小试身手")
ceshi()

加装饰器的情况:

 

# @decorator
# def ceshi():
#     print("小试身手")
# ceshi()

可以看到,加装饰器的函数,可以在不改动原有函数的基础上增加新的功能,增添新的作用

有参装饰器:

当然装饰器也是可以传参的,我们可以来看一下,先定义一个传参的装饰器:

def timer(threshold):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"{func.__name__} is running.")
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            print(f"{func.__name__} 执行时间:{end_time - start_time}")
            if end_time - start_time > threshold:
                print(f"{func.__name__} took longer than {threshold} ")
            return result

        return wrapper

    return decorator

 不加装饰器的普通函数:

def sleep_o4():
    time.sleep(0.4)
    print('睡一会')

sleep_o4()

加装饰器的函数:

@timer(0.2)
def sleep_o4():
    time.sleep(0.4)
    print('睡一会')


sleep_o4()

 

为什么要使用装饰器:

第一个原因是,使用装饰器可以提升代码复用,避免重复冗余代码。如果我有多个函数需要测量执行时间,我可以直接将装饰器应用在这些函数上,而不是给多个函数加上一样的代码。这样的代码既冗余也不方便后面维护。


第二个原因是,使用装饰器可以保证函数的逻辑清晰。如果一个本身功能就很复杂的函数,我还要通过修改内部代码来测量运行时间,这样会模糊函数自身的主逻辑。同时,软件开发的一个原则就是单一职责,也就是说,一个函数只应该承担一项责任。


第三,通过装饰器,我们可以扩展别人的函数。想象我们正在使用一个第三方库的函数,但我要添加额外的行为,比如测量运行时间,那我就可以用装饰器去包装,而不是跑到库里面去修改。 

标签:函数,Python,func,time,print,装饰,def
From: https://blog.csdn.net/wadjdkdkdjjd/article/details/143269873

相关文章

  • Python学习的自我理解和想法(24)
    学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第24天,学的内容是python对Excel的操作。开学了,时间不多,写得不详细,见谅。目录1.插件介绍2.安装openpyxl3.读取Excel文件内容(1).加载一个工作簿(2).获取工作表名称(3).获取具体的工作表(4).获......
  • Python学习的自我理解和想法(23)
    学的是b站的课程(麦叔),跟老师写程序,不是自创的代码!今天是学Python的第23天,学的内容是正则表达式。开学了,时间不多,写得不多,见谅。目录1.七个境界level1固定的字符串level2 某一类字符串level3 重复某一类字符level4 组合level2level5 多种情况level6 限定位......
  • Python SQLite数据库编程
    Python内置 SQLite库直接使用,简单,适合初学者。做更复杂软件,建议重新选用数据库从例子开始:示例代码:#导入模块importsqlite3#连接数据库,返回连接对象conn=sqlite3.connect("D:/my_test.db")#调用连接对象的execute()方法,执行SQL语句#(此处执行的是DDL语句,创......
  • micropython+ESP32S3+MFRC522射频卡模块读卡号
    参考连接:https://doc.itprojects.cn/A0004.iot/01.doc.c0e19433a76e2e42f143ba0ded917201/index.html#/q02.rfid.011)ESP32S3+MFRC522射频卡模块图 #接线说明#MFRC522_sck  =ESP32S3_Pin(14)#MFRC522_mosi=ESP32S3_Pin(13)#MFRC522_miso=ESP32S3_Pin(12)#MFRC......
  • Python——石头剪刀布(附源码+多模式二改优化版)
    编程初学者通常会从简单的项目开始,以建立基础并增强信心。石头剪刀布游戏是一个很好的起点,因为它涉及到基本的逻辑判断、用户输入处理和随机数生成。本文将详细介绍如何使用Python编写一个石头剪刀布游戏,并提供完整的代码和解释。目录一、游戏介绍二、基本代码解析与实现......
  • Python之pyserial模块 串口通信
    python之pyserial模块原文链接:https://www.cnblogs.com/sureZ-learning/p/17054481.htmlpyserial模块封装了对串口的访问,兼容各种平台(Windows、Linux、MACOS等)。其支持的特性如下:所有平台基于类的接口相同端口可以通过python来设置支持不同数据长度、停止位、奇偶校验位、流......
  • Python深度学习进阶与前沿应用(注意力机制详解、生成式模型详解、自监督学习模型详解、
    近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型(BERT、GPT-1/2/3/3.5/4、DETR、ViT、SwinTransformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Di......
  • ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、农业
    在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。原文链接:ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、......
  • 使用MicroPython开发ESP32系列单片机程序入门
    请参考网络ESP32教程地址:https://www.itprojects.cn/coursecenter-hardware.html以ESP32-S3为例讲述烧录固件过程1、下载Micropython固件。首次使用ESP32时,需要将micropython固件烧录到ESP32内。不同芯片,Micropython固件不同。固件下载地址 为:https://micropython.org/dow......
  • centos安装最新Python
    1.卸载现有Python版本sudoyumremovepython2.安装开发工具sudoyumgroupinstall"DevelopmentTools"-ysudoyuminstallopenssl-develbzip2-devellibffi-devel-y3.下载Python源代码curl-Ohttps://www.python.org/ftp/python/3.11.4/Python-......