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

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按名称分配

@浙大疏锦行

http://www.jsqmd.com/news/156742/

相关文章:

  • PyTorch-CUDA-v2.6镜像中安装SpaCy自然语言处理库注意事项
  • DAY31@浙大疏锦行
  • DAY32 类的定义与方法
  • Proteus 8.0时钟信号源详解:晶振与脉冲发生器配置
  • ModbusRTU通信基础:CRC校验计算完整示例
  • 再也不怕环境冲突:PyTorch-CUDA-v2.6镜像隔离式开发体验
  • PyTorch-CUDA-v2.6镜像与VS Code Remote-SSH协作开发指南
  • 如何导出PyTorch-CUDA-v2.6镜像用于私有部署?操作命令分享
  • PyTorch-CUDA-v2.6镜像中安装自定义Python包的方法
  • 超详细版解析c9511e无法确定toolkit
  • 用%20Portainer%20部署%20Nginx%20很简单?加个%20cpolar%20远程访问更给力
  • 大数据挖掘中的模型漂移检测技术
  • vivado2023.2安装常见问题解析:系统学习手册
  • 【CMake】概述
  • cc2530无线丢包问题的协议层解决方案
  • 远程开发AI模型:SSH连接PyTorch-CUDA-v2.6镜像详细步骤
  • ✅2026最全Java毕业设计选题方向汇总|附难度分级+技术栈建议
  • 【CMake】`set()` 命令详解
  • PyTorch-CUDA-v2.6镜像运行GPT-2文本生成模型实操
  • Opencv总结4——项目实战-信用卡数字识别
  • 快速理解Crash时的堆栈回溯技术要点
  • KiCad原理图打印设置完整示例:精准布局输出技巧
  • PyTorch-CUDA-v2.6镜像中定时备份Jupyter Notebook脚本的方法
  • PyTorch-CUDA-v2.6镜像如何实现多卡并行训练?技术细节曝光
  • WSLRegisterDistribution failed错误终结者:PyTorch-CUDA-v2.6完美兼容WSL2
  • 从零实现CH340 USB转232驱动安装流程
  • 清华镜像源加速下载PyTorch-CUDA-v2.6,解决installing this may take a few minutes问题
  • PyTorch-CUDA-v2.6镜像发布:专为大模型token生成优化的GPU环境
  • 超详细版Screen to GIF音频同步录制教学
  • 【毕业设计】SpringBoot+Vue+MySQL 社区网格化管理平台平台源码+数据库+论文+部署文档