news 2025/12/31 6:54:15

DAY31 函数专题2:装饰器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY31 函数专题2:装饰器

前言:在上一个章节中我们主要讨论了函数的基本定义方式和基本的用法,在本节中我们将引入一个新的概念装饰器。装饰器是函数的"外包装",装饰器是一个可以给函数"穿衣服"的特殊函数,不改变原函数代码就能增加新功能。

一、选用装饰器的原因

原因一:使用装饰器可以提升代码复用,例如我有多个函数需要测量执行时间,我可以直接将装饰器应用在这些函数上,而不用在每个函数上进行重复代码的书写。

原因二:保证函数的逻辑清晰,使用装饰器可以使得一个函数只承担单一的责任。

原因三:扩展他人写好的函数,通过装饰器可以直接添加额外功能,而不需要去对应的库中进行相关的修改。

二、应用示例

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

def logger(func): def wrapper(*args, **kwargs): # args 是元组,kwargs 是字典 print(f"开始执行函数 {func.__name__},参数: {args}, {kwargs}") result = func(*args, **kwargs) print(f"函数 {func.__name__} 执行完毕,返回值: {result}") return result return wrapper @logger def multiply(a, b): return a * b multiply(2, 3) # 调用 multiply 函数,观察日志输出

其中

@logger
def multiply(a, b):
return a * b

multiply(2, 3)

--------------------------------------------------------等价于----------------------------------------------------------------

def multiply(a, b):
return a * b

multiply = logger(multiply)

值得注意的是

return wrapper(返回函数本身,可多次使用的工具)、return wrapper()(立即执行函数,一个结果值)。

举个例子:对于return wrapper:

def create_calculator(operation): if operation == "add": def add_numbers(a, b): return a + b return add_numbers # 返回加法计算器 elif operation == "multiply": def multiply_numbers(a, b): return a * b return multiply_numbers # 返回乘法计算器 # 得到计算器 my_adder = create_calculator("add") my_multiplier = create_calculator("multiply") # 可以多次使用 print(my_adder(2, 3)) # 5 print(my_adder(10, 20)) # 30 print(my_multiplier(4, 5)) # 20

对于 return wrapper():

def calculate_once(): def add_numbers(a, b): return a + b return add_numbers(2, 3) # ❌ 立即计算 2+3 # 只能得到一个结果 result = calculate_once() print(result) # 5 # 不能计算其他数 # 这个函数只能算 2+3

一个参数设定时的典型错误:

关键规则总结

  1. 顺序:位置参数必须在前,关键字参数在后

  2. 一旦用关键字参数,后面的所有参数必须都用关键字参数

  3. 可以混用,但必须保持"位置→关键字"的顺序

  4. 关键字参数可以打乱顺序,因为Python按名称分配

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/29 2:05:54

大数据挖掘中的模型漂移检测技术

当AI模型“变心”:大数据挖掘中模型漂移的检测与应对 关键词 模型漂移、概念漂移、数据漂移、在线漂移检测、ADWIN算法、Evidently AI、在线学习 摘要 你有没有过这样的经历?明明去年还很准的推荐系统,今年却总给你推过时的商品;明明训练时准确率95%的欺诈检测模型,上…

作者头像 李华
网站建设 2025/12/29 2:05:28

PyTorch-CUDA-v2.6镜像运行目标检测模型YOLOv8性能对比

PyTorch-CUDA-v2.6镜像运行目标检测模型YOLOv8性能对比 在当今智能视觉应用爆炸式增长的背景下,如何快速、稳定地部署高性能目标检测系统,已成为算法工程师和研发团队面临的核心挑战。从自动驾驶车辆识别行人,到工厂流水线上的缺陷检测&#…

作者头像 李华
网站建设 2025/12/29 2:03:23

cc2530无线丢包问题的协议层解决方案

用协议层“软实力”驯服 CC2530 的无线丢包顽疾你有没有遇到过这样的场景:精心部署的 Zigbee 传感器网络,突然在关键时刻掉链子——控制指令发不出去,温湿度数据莫名其妙丢失。排查半天,发现不是天线没焊好,也不是电源…

作者头像 李华
网站建设 2025/12/29 2:00:46

如何导出PyTorch-CUDA-v2.6镜像用于私有部署?操作命令分享

如何导出 PyTorch-CUDA-v2.6 镜像用于私有部署?实战命令详解 在当前深度学习项目频繁落地企业内网、边缘设备和离线环境的背景下,如何将一个已经验证过的 GPU 开发环境安全、完整地迁移到目标服务器,成为许多 AI 工程师面临的实际挑战。我们…

作者头像 李华
网站建设 2025/12/29 2:00:23

PyTorch-CUDA-v2.6镜像中使用nvidia-smi监控GPU状态

在 PyTorch-CUDA-v2.6 镜像中使用 nvidia-smi 监控 GPU 状态 你有没有遇到过这样的情况:启动了一个深度学习训练任务,满怀期待地等待模型飞速收敛,结果却发现 GPU 利用率只有 10%,显存占用也不高——明明硬件资源就在眼前&#xf…

作者头像 李华
网站建设 2025/12/29 1:58:33

KiCad原理图打印设置完整示例:精准布局输出技巧

如何把 KiCad 原理图打印得既专业又清晰?实战配置全解析你有没有遇到过这种情况:花了几小时画完一张复杂的原理图,信心满满地点击“打印”,结果输出的图纸要么内容被裁掉一半,要么字体小得要用放大镜看,电源…

作者头像 李华