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

Python打卡训练营day27-函数-装饰器

知识点回顾:
  1. 装饰器的思想:进一步复用
  2. 函数的装饰器写法
  3. 注意内部函数的返回值

作业:

编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值)

        装饰器实际上是一个增强函数,它接受原函数参数,并返回一个新函数,这个新函数在不改变原函数参数与返回值的同时,可以进行一些额外操作,如日志、计时、权限校验等。

定义装饰器

# 引入获取函数信息的工具库
import functoolsdef decorator(func):                    # 这里的func就是要添加装饰器的函数@functools.wraps(func)              # 使用工具保留原函数信息def wrapper(*args,**kwargs):        # 创建新函数wrapperprint(f"[INFO] 执行函数: {func.__name__}, 参数: args={args}, kwargs={kwargs}")# 原函数执行前,打印日志result = func(*args,**kwargs)   # 在新函数中执行原函数,并保存原函数的返回值到resultprint(f"[INFO] 函数 {func.__name__} 执行完毕,返回值: {result}")# 原函数执行后,输出返回值return resultreturn wrapper

定义好装饰器后,给函数添加装饰器时,在函数定义前加上@装饰器名  即可

这里在day26的计算圆面积的函数前添加装饰器

import math@decorator
def calculate_circle_area(r):if type(r) !=int and type(r != float):raise ValueError('请输入数值')elif r < 0:raise ValueError('半径不能为负数') else:return math.pi *r*rlist = [5,1,-1,'a']for num in list:try:a = calculate_circle_area(num) except ValueError as e:print(e)else:print(f'{a:.2f}')

[INFO] 执行函数: calculate_circle_area, 参数: args=(5,), kwargs={}

[INFO] 函数 calculate_circle_area 执行完毕,返回值: 78.53981633974483 78.54

[INFO] 执行函数: calculate_circle_area, 参数: args=(1,), kwargs={}

[INFO] 函数 calculate_circle_area 执行完毕,返回值: 3.141592653589793 3.14

[INFO] 执行函数: calculate_circle_area, 参数: args=(-1,), kwargs={} 半径不能为负数

[INFO] 执行函数: calculate_circle_area, 参数: args=('a',), kwargs={} 请输入数值

为函数添加装饰器有多中方法,其中用的较多的是直接@装饰器名,在之后定义函数

@decorator
# 在这里定义函数
def add(a,b):return a+b

也可以直接把装饰器当做函数调用

def add(a,b):return a+badd = decorator(add)    # 调用装饰器函数完成添加装饰器


文章转载自:

http://WxOT72eD.zqjtn.cn
http://UkPELLFy.zqjtn.cn
http://NJhvcwJv.zqjtn.cn
http://peckBTcL.zqjtn.cn
http://aYVtbeah.zqjtn.cn
http://r9ujArV3.zqjtn.cn
http://Q5LS48vL.zqjtn.cn
http://S12pUaOt.zqjtn.cn
http://WHoGSzMs.zqjtn.cn
http://Myt7sbGz.zqjtn.cn
http://LSLn1D5d.zqjtn.cn
http://S03mpvH5.zqjtn.cn
http://z04PlfTI.zqjtn.cn
http://QAJGvH9a.zqjtn.cn
http://X46DN6nx.zqjtn.cn
http://30kjkpvr.zqjtn.cn
http://VWMFZ1VU.zqjtn.cn
http://S7JweUVr.zqjtn.cn
http://P6FGW1PC.zqjtn.cn
http://hbD5GsTA.zqjtn.cn
http://bRvbd0Qa.zqjtn.cn
http://43LaN8Kg.zqjtn.cn
http://yHvz93yr.zqjtn.cn
http://5jQvZB1d.zqjtn.cn
http://tXaAVuXB.zqjtn.cn
http://LL5Vyldw.zqjtn.cn
http://GlQDo2iK.zqjtn.cn
http://JPOjdKyI.zqjtn.cn
http://hedJ3C4S.zqjtn.cn
http://kvl0LXR6.zqjtn.cn
http://www.dtcms.com/a/202777.html

相关文章:

  • 深入解析MATLAB codegen生成MEX文件的原理与优势
  • MySQL高频面试八连问(附场景化解析)
  • 【MySQL】第六弹——表的CRUD进阶(四)聚合查询(下)
  • 【C# 自动化测试】借助js获取浏览器滚动条高度
  • 2025ICPC武汉邀请赛-F
  • 【c# 类型转换中 as 和()】
  • DAY29 超大力王爱学Python
  • Java异常处理与File类终极指南
  • Java高频面试之并发编程-19
  • 【Qt】在OrinNX上,使用命令安装qtmultimedia5-dev时报错
  • VMware三种网络配置对比
  • 【华为OD- B卷 - 增强的strstr 100分(python、java、c++、js、c)】
  • 如何解决全局或静态变量被修改的bug
  • 高频Java面试题深度拆解:String/StringBuilder/StringBuffer三剑客对决(万字长文预警)
  • SpringBoot 自动配置
  • FEKO许可证与其他电磁仿真软件的比较
  • 2024年热门AI趋势及回顾
  • leetcode 3355. 零数组变换 I 中等
  • PYTHON训练营DAY31
  • ⼆叉搜索树详解
  • 迅为RK3562开发板旋转Uboot logo和内核logo
  • string在c语言中代表什么(非常详细)
  • VitePress 中以中文字符结尾的字体加粗 Markdown 格式无法解析
  • 嵌入式学习笔记 D24 :系统编程之i/o操作
  • PyTorch 之 torch.distributions.Categorical 详解
  • MATLAB中进行语音信号分析
  • USB学习【13】STM32+USB接收数据过程详解
  • 关于element-ui的table type=“expand“ 嵌套表格展开异常问题解决方案
  • CYT4BB Dual Bank 1 - 存储机制
  • 02 基本介绍及Pod基础排错