深入解析Python装饰器及*args, **kwargs的妙用

深入解析Python装饰器及*args, **kwargs的妙用

简介:

​ 装饰器(Decorator)是 Python 中一种强大的语法特性,它允许在不修改原始函数代码的情况下,动态地扩展函数的功能。装饰器是函数或类,用于包装其他函数或类,并提供额外的功能。

​ 在 Python 中,装饰器通过使用 @ 符号将其应用于函数或类。装饰器可以在函数定义之前定义,并在函数调用时自动应用。以下是装饰器的基本语法:

@decorator
def function():# 函数体

decorator 是一个装饰器,它将被应用于下方定义的函数 function。装饰器可以是一个函数或一个类。

基础铺垫:

*args

​ 在函数定义中,*args 表示接受任意数量的位置参数。它将传递的参数打包成一个元组(tuple),可以在函数体内使用。这样,函数就可以处理不确定数量的参数。

def calculate_sum(*args):total = sum(args)return totalresult = calculate_sum(1, 2, 3, 4, 5)
print(result) # 输出15
解包:

​ 解包是指将一个容器(如元组、列表、字典等)中的值拆分为独立的元素。在函数调用或变量赋值的过程中,可以使用解包操作将容器中的值分配给对应的变量。

def my_function(a, b, c):print(a, b, c)args = (1, 2, 3)
my_function(*args)  # 解包元组,等同于 my_function(1, 2, 3)
**kwargs

**kwargs 表示接受任意数量的关键字参数。它将传递的参数打包成一个字典(dictionary),可以在函数体内使用。这样,函数就可以处理不确定数量的关键字参数。关键字参数就是,a=b,指定谁等于谁。

def print_values(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_values(name="Alice", age=25, city="London")

输出:

name: Alice
age: 25
city: London
配合使用:
def my_function(a, b, c):print(a, b, c)args = (1, 2, 3)
kwargs = {"a": 4, "b": 5, "c": 6}my_function(*args)         # 等同于 my_function(1, 2, 3)
my_function(**kwargs)      # 等同于 my_function(a=4, b=5, c=6)

在这里插入图片描述

深入分析:

案例一:
import timedef calculate_time(func):  # 这个函数的参数就是被装饰的函数即 func=my_functiondef wrapper():start_time = time.time()print("开始计时")func()end_time = time.time()print("结束计时")print("函数执行时间:", end_time - start_time, "秒")return wrapper@calculate_time  # 相当于 calculate_time(my_function) 将函数作为参数
def my_function():time.sleep(2)print('我是被装饰函数')

@calculate_time 是将 calculate_time 函数作为一个装饰器。

我花了一幅图片给大家看看执行过程:

在这里插入图片描述

​ 其实很简单,就是装饰器函数被被装饰函数当作参数来进行调用,然后装饰器的写法是固定的。

在这里插入图片描述

案例二:
def outer(f):  # 2.f == func 将被装饰函数的名字传递给参数fdef inner():# 6.执行inner函数体操作f()  # 6.1.调用原先的func函数print('注册功能')  # 6.2 执行添加的新功能return inner  # 3.此处的返回值会返回给被装饰函数的名字@outer  # 1.调用outer装饰器函数
def func():  # 4. func == innerprint('登录功能')func()  # 5.func() == inner()
# 需求:给func函数增添一个注册功能

在这里插入图片描述

案例三:

​ 我们看看下面这个案例,通过装饰器,我们可以丰富每个函数的功能,可以使代码更加模块化和可复用。

def outer(func):def inner():print('认证功能操作')result = func()return resultreturn inner# 基础平台部门开发了上百个函数的API
@outer # 调用装饰器函数 函数参数是另一个函数 
def f1():print('业务部门1的数据接口......')@outer
def f2():print('业务部门2的数据接口......')@outer
def f3():print('业务部门3的数据接口......')@outer
def f100():print('业务部门100的数据接口......')# 无参
f1()
f2()
f3()
f100()
案例四:
def outer(func):def inner(name):print('新功能!')func(name)return inner@outer #相当于f1 = outer(f1(name))
def f1(name):print('f1的原有功能,f1的参数值为:', name)f1('xxxx')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GO设计模式——17、解释器模式(行为型)

目录 解释器模式(Interpreter Pattern) 解释器模式的核心角色: 优缺点 代码实现 解释器模式(Interpreter Pattern) 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式&am…

SQL server 数据库 SQL语句高级用法

1、表的高级查询 use student select * from stuinfo1 -- 使用 in 的子查询 select * from stuinfo where stu_age in ( select stu_age from stuinfo where cla_id 12345 ) select * from stuinfo where stu_age in ( 19 , 20 , 21 , 25 , 23 , 1…

云上荆楚丨云轴科技ZStack成功实践精选(湖北)

湖北自古以来有九省通衢的美称,地处长江中游,富有荆楚之美誉,灵秀之蕴意。2022年湖北数字经济强省三年行动计划正式印发,计划到“十四五”末,数字经济核心产业增加值力争达到7000亿元,占GDP的比重超过12%。…

《每天一分钟学习C语言·七》指针、字节对齐等

1、 对于二维数组如a[3][4]可以当做有三个元素的一维数组,每个元素包含四个小元素。 2、 printf(“%-5d”, i); //负号表示左对齐,5d表示空五个光标的位置 3、 栈:先进后出,堆:先进先出 4、 (1&#xff…

【HTML5】HTML5 语音合成

一、前言 前一段时间在项目中需要用到播报文字语音。找到了 HTML 5 有这样的功能。 现在有时间进行总结下。 二、SpeechSynthesis SpeechSynthesis 接口是语音服务的控制接口。它可以用于获取设备上关于可用的合成声音的信息, 开始、暂停语音,或者别…

位运算:Leetcode137.只出现一次的数字(2)

题目描述: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1: 输入:nums [2,2,3,2] 输出:3示例 2: 输入&…

《工具箱-SVN》SVN安装、备份、迁移教程

文章目录 一、服务器搭建SVN1.检查SVN是否存在2.安装SVN3.创建版本库4.创建版本库存放文件地址5.修改配置文件5.1 vim authz5.2 vim passwd5.3 vim svnserve.conf 6.启动并查看SVN7.SVN Checkout8.SVN Update9.SVN Commit 二、SVN-无法连接主机,目标计算机积极拒绝&…

案例 | 电源自动检测测试系统为某电子科技公司定制电源测试解决方案

一、测试背景 陕西某电子科技公司是一家专业生产设计军品电源、集成电路以及电子元器件的高新技术企业,公司虽有一套半自动ATE测试系统,但使用过程繁琐复杂且无法满足日益增长的测试需求,因此公司现需要一套更加优秀的全自动电源测试系统来应…

工具系列:PyCaret介绍_多分类代码示例

👋 工具系列:PyCaret介绍_多分类代码示例 PyCaret 介绍 PyCaret是一个开源的、低代码的Python机器学习库,可以自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,可以大大加快实验周期并提高生产效率。 与其他开…

HDFS NFS Gateway(环境配置,超级详细!!)

🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 😘《CTF专栏》超级详细的解析,宝宝级教学让你从蹒跚学步到健步如飞🙈 😎《大数据专栏》大数据从0到秃头👽&…

【论文阅读】FreeU: Free Lunch in Diffusion U-Net

FreeU: 无需训练直接提升扩散模型生成效果。 paper:https://arxiv.org/abs/2309.11497 code:GitHub - ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net 1. 介绍 贡献: •研究并揭示了U-Net架构在扩散模型中去噪的潜力&#xff0…

Redis单机、主从、哨兵、集群配置

单机配置启动 Redis安装 下载地址:Download | Redis 安装步骤: 1: 安装gcc编译器:yum install gcc 2: 将下载好的redis‐5.0.3.tar.gz文件放置在/usr/local文件夹下,并解压redis‐5.0.3.tar.gz文件 wget http://download.re…

react生命周期详解,代码示例(新生命周期,与旧生命周期对比)

旧生命周期:https://blog.csdn.net/kkkys_kkk/article/details/135130549?spm1001.2014.3001.5501 目录 React 生命周期中常见的坑 为什么要移除 “will” 相关生命周期方法呢? Fiber是什么 新生命周期图示 新增生命周期与功能变化 完整生命周期…

C语言操作符详解+运算符优先级表格

目录 前言 一、操作符是什么? 二、操作符的分类 三、算术操作符 四、逻辑操作符 五、比较操作符 六、位操作符 七、赋值操作符 八、其他操作符 九、运算符优先级表格 总结 前言 在编写程序时,最常用到的就是操作符,本文将详细的介绍…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(28)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(27) 上回书在探究i915_gem_object_lookup_rcu函数调用idr_find函数时所传递的参数的时候,由第1个实参&file->object_idr引出了对于它是在何时何处赋值的探索。 static inline struct drm_i915_…

RAG框架LlamaIndex核心——各种索引应用分析

目录 LLM私域数据训练问题 什么是LlamaIndex 提供的工具 如何使用 一些核心术语

Golang 的内存管理

文章目录 1.内存管理角色1.常见的内存分配方法线性分配器空闲链表分配器TCMalloc 2.Go 内存管理组件mspanmcache初始化替换微分配器 mcentralmheap 3.内存分配4.内存管理思想参考文献 1.内存管理角色 内存管理一般包含三个不同的组件,分别是用户程序(Mu…

对比学习综述

1.简介 2.相关工作 2.1、Inst Disc 代理任务:个体判别。把每一个图片看作是一种类别,把每一个图片都区分开来。 正负样本选择:正样本是图片本身,负样本是数据集里的其他图片,该文章从memory bank中随机抽取4096个负…

【C语言】指针详解(三)

1.指针运算 指针的基本运算有三种,分别是:⭐指针-整数 ⭐指针-指针 ⭐指针的关系运算 1.1指针 - 整数 因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。 int arr[10]{1,2,3,4,5,6,7,8,9,10} #inc…

劈窗算法反演地表温度

目录 摘要操作步骤提取热红外单波段提取NDVI同步像元分辨率与个数劈窗算法地表温度反演制图 摘要 主要使用HJ-2(环境减灾二号卫星)的IRS传感器的两个热红外波段,以及红波段与近红波段计算得到的NDVI,使用劈窗算法,得到…