当前位置: 首页 > news >正文

学习之什么是装饰器

什么是装饰器

本质:就是一个函数,能为其它的函数增加额外功能
在这里插入图片描述

# 目标函数
def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""total = 0for i in range(1, n+1):total += i ** 2
"""
额外的功能能统计目标函数执行的耗时
"""
def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""start_time = time()total = 0for i in range(1, n+1):total += i ** 2end_time = time()print("函数执行的耗时:{}".format(end_time - start_time))return totalif __name__ == '__main__':print(power_num(30000000))
# 定义装饰函数--能统计目标函数执行的耗时
def elapsed_time(func):"""能统计目标函数执行的耗时"""def decorated(*args, **kwargs):start_time = time()# 由于目标函数有可能传入一个参数,两个参数或者是关键字参数,所以这里用通用参数占位result = func(*args, **kwargs)end_time = time()print("函数执行的耗时:{}".format(end_time - start_time))return resultreturn decorated# 目标函数
def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""total = 0for i in range(1, n+1):total += i ** 2return totalif __name__ == '__main__':# 调用装饰函数去装饰目标函数,返回被装饰后的函数  相当于在目标函数上添加@elapsed_time# 对目标函数进行elapsed装饰器函数的调用,返回一个装饰后的名字还是叫power_num的函数power_num = elapsed_time(power_num)print(power_num(30000000))
# 装饰函数需要传入参数
def elapsed_pre(pre):"""装饰函数需要传入参数"""def elapsed_time(func):"""能统计目标函数执行的耗时"""def decorated(*args, **kwargs):start_time = time()# 由于目标函数有可能传入一个参数,两个参数或者是关键字参数,所以这里用通用参数占位result = func(*args, **kwargs)end_time = time()print("函数执行的耗时:{}".format(round((end_time - start_time), pre)))return resultreturn decoratedreturn elapsed_time# 目标函数
@elapsed_pre(3)
def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""total = 0for i in range(1, n+1):total += i ** 2return totalif __name__ == '__main__':print(power_num(30000000))

相关文章:

  • Java | Leetcode Java题解之第435题无重叠区间
  • 5.3 克拉默法则、逆矩阵和体积
  • Kafka系列之:安装使用kafka_exporter详细步骤
  • 基于大数据的亚健康人群数据分析及可视化系统
  • 828华为云征文|华为云Flexus X实例:快速搭建FTP服务器,高效便捷!
  • 计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档
  • 给Ubuntu虚拟机设置静态IP地址(固定IP)
  • 安全开发指南
  • ESXi 5.5 系统克隆到SD卡或USB磁盘上
  • 利士策分享,攀登职场高峰:成功者的十大特质
  • 示例说明:sql语法学习
  • 基于YOLOv5的农作物病虫害识别系统设计与实现(PYQT+web端+微信小程序+YOLOv5+训练数据集+论文+部署文档+开题报告)
  • AI与大数据的结合:如何从海量数据中提取价值
  • 青动CRM-E售后V2.0.4
  • detectron2是怎么建立模型的?以SparseInst代码为例【结论版】
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【刷算法】求1+2+3+...+n
  • 【知识碎片】第三方登录弹窗效果
  • iOS 系统授权开发
  • JavaScript DOM 10 - 滚动
  • js中forEach回调同异步问题
  • Spring Cloud Feign的两种使用姿势
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Unix命令
  • Vue UI框架库开发介绍
  • 产品三维模型在线预览
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端知识点整理(待续)
  • 入口文件开始,分析Vue源码实现
  • 使用Swoole加速Laravel(正式环境中)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • Nginx实现动静分离
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 进程与线程(三)——进程/线程间通信
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #APPINVENTOR学习记录
  • #QT(智能家居界面-界面切换)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (WSI分类)WSI分类文献小综述 2024
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Windows2003安全设置/维护
  • ***监测系统的构建(chkrootkit )
  • .Net Core和.Net Standard直观理解
  • .net framework4与其client profile版本的区别
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NetCore发布到IIS
  • .NET业务框架的构建
  • @antv/g6 业务场景:流程图