当前位置: 首页 > 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)    # 调用装饰器函数完成添加装饰器

相关文章:

  • 深入解析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
  • ⼆叉搜索树详解
  • 页游网站如何做推广/如何推销自己的产品
  • 咸阳网站网站建设/免费seo快速排名工具
  • 怎么做便民信息网站/离我最近的广告公司
  • 沈阳网站外包公司/十种营销方式
  • p2p电影网站开发/深圳seo优化公司搜索引擎优化方案
  • wordpress标签重定向/重庆seo优