Python技巧:​args 和 kwargs 原来这么强大

article/2025/10/14 22:49:58

大家好,今天我给大家分享Python技巧:​args 和 kwargs的相关技巧。喜欢记得收藏、关注、点赞。

注:完整代码、资料、技术交流文末获取

现在argskwargs参数仍然是 Python 中非常有用的特性,而且理解它们的威力将使您成为更有效的开发人员。

那么“args”和“kwargs”参数用来做什么呢?

它们允许一个函数接受可选参数,因此你能够在你的模块和类里创建弹性APIs。

示例代码如下:

In [2]: def foo(required, *args, **kwargs):...:     print(required)...:     if args:...:         print(args)...:     if kwargs:...:         print(kwargs)

上面的函数需要至少一个叫做“必须的”参数,但是它也能接受额外的位置参数和关键字参数。

如果我们调用带有附加参数的函数,参数将会收集额外的位置参数作为一个元组,因为这个参数的名字有一个*(单星号)前缀。

同样地,kwargs将收集额外的关键字参数作为一个字典,因为这个参数名字有**(双星号)前缀。

如果没有附加参数被传递给函数。args 和 kwargs 可以为空。

当我们调用带有参数的不同组合的函数时,你会看到在args和kwargs内部参数。

Python如何收集它们,根据它们是否为位置参数或者关键字参数。代码如下:

In [3]: foo()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-c19b6d9633cf> in <module>
----> 1 foo()TypeError: foo() missing 1 required positional argument: 'required'
In [4]: foo('hello')
hello
In [5]: foo('hello', 1, 2, 3)
hello
(1, 2, 3)
In [6]: foo('hello', 1, 2, 3, key1='value', key2=999)
hello
(1, 2, 3)
{'key1': 'value', 'key2': 999}

我要明确一下,调用args和kwargs参数是简单的命名惯例。

像之前的例子里,如果称他们*parms和**argv也可以。实际上语法分别是单星号(*)或者双星号(**)。

然而,我还是推荐你还是坚持可接受的命名惯例以避免混淆。(而且每隔一段时间还有机会喊“argh!”和“kwargh!”)。

## 转发可选或者关键字参数

有可能从一个函数到另一个函数传递可选或者关键字参数。

当你调用要转发参数的函数时,你可以通过使用解包参数操作符*和**。在你传递之前这也给你一个机会修改参数。

示例如下:

In [8]: def foo(x, *args, **kwargs):...:     kwarg['name'] = 'Alice'...:     new_args = args + ('extra', )...:     bar(x, *new_args, **kwargs)

这种技术对于子类化和编写包装函数很有用。

例如,您可以使用它来扩展父类的行为,而不必在子类中复制其构造函数的完整签名。

如果您使用的 API 可能会在您的控制之外发生变化,这会非常方便,示例代码如下:

In [9]: class Car:...:     def __init__(self, color, mileage):...:         self.color = color...:         self.mileage = mileage...: In [10]: class AlwaysBlueCar(Car):...:     def __init__(self, *args, **kwargs):...:         super().__init__(*args, **kwargs)...:         self.color = 'blue'In [12]: AlwaysBlueCar('green', 48392).color
Out[12]: 'blue'

AlwaysBlueCar 构造函数只是将所有参数传递给它的父类,然后覆盖一个内部属性。

这意味着如果父类构造函数发生更改,AlwaysBlueCar 很有可能仍会按预期运行。

这里的缺点是 AlwaysBlueCar 构造函数现在有一个相当无用的签名——如果不查找父类,我们不知道它需要什么参数。

通常,您不会将这种技术用于您自己的类层次结构。更有可能的情况是您想要修改或覆盖某些您无法控制的外部类中的行为。

但这总是危险的领域,所以最好小心(否则你可能很快就会有另一个理由尖叫“argh!”)。

这种技术可能有用的另一种情况是编写包装函数,例如装饰器。在那里,您通常还希望接受要传递给包装函数的任意参数。

而且,如果我们可以在不必复制和粘贴原始函数签名的情况下做到这一点,那可能更易于维护:

import functools
def trace(f):...:     @functools.wraps(f)...:     def decorated_function(*args, **kwargs):...:         print(f, args, kwargs)...:         result = f(*args, **kwargs)...:         print(result)...:     return decorated_functionIn [11]: @trace...: def greet(greeting, name):...:     return '{}, {}!'.format(greeting, name)
In [14]: greet('Hello', 'Bob')
<function greet at 0x7fefa69db700> ('Hello', 'Bob') {}
Hello, Bob!

使用像这样的技术,有时很难在使代码足够明确的想法和遵守不要重复自己(DRY)原则的想法之间取得平衡。

这可能永远是一个艰难的选择。如果你能从同事那里得到第二个意见,我鼓励你尝试一下。

推荐文章

  • 李宏毅《机器学习》国语课程(2022)来了

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 香的很,整理了20份可视化大屏模板

技术交流

完整代码、数据获取,可以找我来要

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

在这里插入图片描述
技术交流、求职内推、干货汇总、与 3000+来自阿里、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~


http://chatgpt.dhexx.cn/article/qOf94bPs.shtml

相关文章

*args和**kwargs是什么意思

去面试的时候&#xff0c;做了一道笔试题——什么是*args和**kwargs&#xff0c;区别在哪里&#xff1f; 有点蒙&#xff0c;好像见过&#xff0c;但是不知道具体的意思。所以回来查了一下资料&#xff0c;做一下笔记。 总的来说&#xff0c;*args代表任何多个无名参数&#x…

埃及分数c语言设计,埃及分数(四)

最优分解 源程序 下面就是求埃及分数最优分解的 C 语言源程序 EgyptianFraction.c&#xff1a; 1: #include 2: #include 3: #include 4: 5: const int SIZE 64; 6: static int wp -1, bp -1; 7: static mpz_t z, w, work[SIZE], best[SIZE]; 8: static mpq_t q1, q2; 9:…

埃及分数问题

问题描述: 古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数&#xff0c;比如7 / 8 1 / 2 1 / 3 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。 思路&#xff1a; 首先要知道什么是真分数&#xff1a;真分数是指大于0小于1的所有分数。这些分数的特…

贪心算法之埃及分数问题

1.问题&#xff1a;给定一个分数&#xff0c;如7/8&#xff0c;我们可以把它表示为1/2 1/3 1/24&#xff0c;埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式&#xff0c;输入一个真分数把其分解为埃及分数之和。 2.设计思路&#xff1a;设分数为a/b,则cb/a,db%a,…

【数模】相关性分析

相关性&#xff1a;如果一个变量的变化引起了另一个变量的变化 目录 一、四种基本变量 二、 相关性分析方法 1.Pearson相关系数 2.Spearman 等级相关系数 3.Kendall tua-b 等级相关系数 4.卡方检测 5.Eta系数 *SPSS操作 三、偏相关 1.SPSS操作 2.偏相关系数和检验&…

数学建模-相关性分析及热力图

目录 一、相关性分析 二、相关性分析实例 三、三种相关系数 3.1 Pearson线性相关系数 3.2 Kendall tau系数 3.3 Spearman相关系数 4、Matlab代码 4.1 Pearson 显著性检验 4.2 Pearson 相关系数矩阵 4.3 Kendalltau相关系数矩阵 4.4 Spearman相关系数矩阵 5、代码…

R语言基础——简单相关性分析(1)

简单相关性分析&#xff08;1&#xff09; 简介1. 协方差和相关系数1.1 协方差1.2 相关系数 2. 相关性分析参考 简介 初次接触相关性分析&#xff0c;在摸索中前进&#xff0c;也顺便将笔记记录下来&#xff0c;未雨绸缪嘛&#xff01; 简单来说&#xff0c;相关性分析就是衡量…

分类变量、有序变量与数值变量相关性分析方法总结及 R 语言应用

文章目录 一、分类 & 分类相关性分析二、有序 & 有序相关性分析三、数值 & 数值相关性分析四、分类 & 有序相关性分析五、分类 & 数值相关性分析六、有序 & 数值相关性分析 本文全部假设显著性水平为0.05&#xff0c;特殊说明的除外。 一、分类 & …

数据分析方法和思维—相关性分析法

01 写在前面 在数据分析的问题中, 经常会遇见的一种问题就是相关的问题, 比如抖音短视频的产品经理经常要来问留存&#xff08;是否留下来&#xff09;和观看时长, 收藏的次数, 转发的次数, 关注的抖音博主数等等是否有相关性, 相关性有多大。 因为只有知道了哪些因素和留存比较…

python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

本文首发地址&#xff1a; https://yishuihancheng.blog.csdn.net/article/details/83547648 欢迎关注我的博客【Together_CZ】&#xff0c;我是沂水寒城&#xff01; 今天我简单地使用了scipy模块进行了统计学中三大相关性分析方法&#xff08;皮尔森相关性系数、斯皮尔曼相…

数据相关性分析笔记

一、数据相关性的含义 数据类型 数据可以是连续的值&#xff0c;比如声音、图像&#xff0c;称为模拟数据。也可以是离散的&#xff0c;如符号、文字&#xff0c;称为数字数据。(ppt)数值型数据、分类型数据、定序数据。 数据相关性 数据相关性是指数据之间存在某种关系&#…

ArcGIS栅格数据图层空间相关性分析方法

ArcGIS栅格数据图层空间相关性分析方法 也不知道严谨不严谨&#xff0c;先Mark吧欸。 矢量的空间相关分析可以通过Spatial Join以后&#xff0c;导出属性表到EXCEL中&#xff0c;进行相关分析Correlation Analysis.  而两个栅格数据图层直接能不能直接在ArcMap中进行相关分…

IBM SPSS Statistics常用的相关性分析方法

灵活运用IBM SPSS Statistics做数据的统计和分析是每个数据分析师都应该掌握的技能&#xff0c;这款软件为用户提供了全面的数据分析方法&#xff0c;可以解决我们在数据分析过程中遇到的各种难题。 接下来小编就为大家介绍一下SPSS相关性分析的方法。 图1&#xff1a;SPSS软件…

神经网络相关性分析方法,神经网络相关性分析图

1、bp神经网络怎么确定输入与输出是正相关还是负相关&#xff1f; 想了解输入输出关系你可以求协方差&#xff0c;进而求peason相关系数 当然你也可以求spearman 等&#xff0c;看他们的相关度即可&#xff0c;正负就代表是正相关还是负相关&#xff0c;具体值代表相关性度量 …

重剑无锋!15种相关分析算法,总有一款适合你!

相关系数&#xff08;Correlation coefficient&#xff09;可用于评估两个变量之间的线性关系&#xff0c;它的值在-1到1之间&#xff0c;-1或1代表完美的负相关和正相关&#xff0c;0表示不存在线性关系。 计算相关系数的方法种类繁多&#xff0c;各有自己的定义以及适用情况…

Keil MDK5中对结构体变量使用结构体成员运算符.后不自动显示结构体成员

MDK5在对结构体变量使用结构体成员运算符.时是会显示结构体成员的&#xff0c;如图所示&#xff1a; 但是有时候使用结构体成员运算符.时并不会出现结构体成员&#xff0c;导致这个问题的原因是没有将自己写的文件添加到工程之中&#xff0c;解决办法如下&#xff1a; 检查是…

【C语言】结构体的创建和使用与结构体内存对齐

结构体创建 前言结构体的声明全局声明特殊声明 结构体变量定义与成员初始化成员类型变量定义匿名结构体变量定义 结构体的自引用结构体成员的访问成员初始化操作符结构体传参 结构体内存对齐对齐数对齐规则 前言 在生活中我们要描述一个人时是不是要知道他的名字、性别、年龄啊…

C语言struct结构体内存

对齐规则&#xff1a; &#xff08;i&#xff09;结构体内 成员存储位置 的起始地址为成员自身长度与默认对齐值 中的较小者的整倍数。 &#xff08;ii&#xff09;结构体A嵌套在结构体B内&#xff0c;则A在B内存储位置起始地址为 A内成员最长长度 的整数倍。 &#xff08;iii&…

嵌入式系统开发:C语言中的位结构体

在嵌入式开发中&#xff0c;经常需要表示各种系统状态&#xff0c;位结构体的出现大大方便了我们&#xff0c;尤其是在进行一些硬件层操作和数据通信时。但是在使用位结构体的过程中&#xff0c;是否深入思考一下它的相关属性&#xff1f;是否真正用到它的便利性&#xff0c;来…

keil中,编写结构体成员运算符(.)后不能自动弹出结构体成员

keil中&#xff0c;编写结构体成员运算符&#xff08;.&#xff09;后不能自动弹出结构体成员 解决办法&#xff1a; 1、确保源文件里面包含sys.h/stm32f10x.h文件&#xff08;或者源文件里面的头文件也行&#xff09; 2、把源文件路径加载到keil里面&#xff08;魔术棒->C/…