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

Python中*args 和 **kwargs作参数时有什么区别

*args 和 **kwargs 是 Python 函数定义中用于处理可变数量的参数的语法,初学者对于二者总是傻傻区分不了,今天我们就来详细解读一下这两个在参数传递时有什么不同。

首先要明白单个星号可以解包元组或者列表,两个星号可以解包字典。如:

print(*[1,3,4,5]) 和print(**{"张三":25, "李四":36, "王五":48}) 可以分别把列表和字典包含的元素打印出来。

一、*args 在Python中是什么意思?

  • *args 用于传递任意数量的非关键字参数给函数。
  • 在函数内部,*args 被作为一个元组对待。

示例:

def test_args_kwargs(arg1, arg2, arg3):print(f"arg1: {arg1}")print(f"arg2: {arg2}")print(f"arg3: {arg3}")args = ("two", 3, 5)
test_args_kwargs(*args) #用*args来替换一个元组,元素个数可以是多个。 

输出:

arg1: two
arg2: 3
arg3: 5

在这个例子中:

  • *args 解包元组 ("two", 3, 5) 并将这些值作为位置参数传递给函数 test_args_kwargs。
  • 函数接收到的参数分别是 arg1 = "two",arg2 = 3,和 arg3 = 5。

二、**kwargs 在Python中是什么意思?

  • **kwargs 允许你传递任意数量的关键字参数给函数。
  • 在函数内部,**kwargs 被作为一个字典对待。

示例:

def test_args_kwargs(arg1, arg2, arg3):print(f"arg1: {arg1}")print(f"arg2: {arg2}")print(f"arg3: {arg3}")kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs) 

输出:

arg1: 5
arg2: two
arg3: 3

在这个例子中:

  • **kwargs 解包字典 {"arg3": 3, "arg2": "two", "arg1": 5} 并将这些值作为关键字参数传递给函数 test_args_kwargs。
  • 函数接收到的参数分别是 arg1 = 5,arg2 = "two",和 arg3 = 3。

三、*args和**args主要区别

*args:用于处理不确定数量的位置参数。如果你不知道要传递给函数的参数数量,或者希望函数能够接受任意数量的参数时,就可以使用 *args。常见场景包括汇总多个值、处理多个输入等。

**kwargs:用于处理不确定数量的关键字参数。当你希望函数能够接受任意数量的带有名称的参数(键值对)时,可以使用 **kwargs。常见场景包括配置选项、动态设置参数等。

*args 用于传递可变数量的非关键字参数给函数。这些参数会被捕获为一个元组。

**kwargs 用于传递可变数量的关键字参数给函数。这些参数会被捕获为一个字典。

这两者可以一起使用,以同时接收位置参数和关键字参数。示例:

def test_args_kwargs(arg1, arg2, arg3, *args, **kwargs):print(f"arg1: {arg1}")print(f"arg2: {arg2}")print(f"arg3: {arg3}")print(f"args: {args}")print(f"kwargs: {kwargs}")test_args_kwargs(1, 2, 3, 4, 5, key1="value1", key2="value2") 

输出:

arg1: 1
arg2: 2
arg3: 3
args: (4, 5)
kwargs: {'key1': 'value1', 'key2': 'value2'}

在这个例子中:

前三个参数被捕获为 arg1,arg2 和 arg3。

接下来的两个参数 4 和 5 被捕获为 args(一个元组)。

关键字参数被捕获为 kwargs(一个字典)。

四、学后总结

  1. *args 处理位置参数(参数的顺序很重要)。**kwargs 处理关键字参数(参数的名称和对应的值很重要)。
  2.  *args 在函数内部是一个元组,你可以使用索引或循环来访问其中的元素。**kwargs 在函数内部是一个字典,你可以通过键来访问其中的值。
  3.  在调用函数时,使用 * 来解包列表或元组,将其作为位置参数传递。使用 ** 来解包字典,将其作为关键字参数传递。
http://www.lryc.cn/news/423731.html

相关文章:

  • [CSS3]2D与3D变换技术详解
  • 大恒相机通过Line2或Line3直接给出3.3V触发,形成分时曝光
  • electronjs实现打开的网页密码自动保存
  • 观测云的自动化监控:CRD 资源与自动发现
  • 九、OpenCVSharp 中的图像形态学操作
  • http和websocket
  • Go 语言错误处理
  • LVS部分配置1
  • datax和datax-web打包成docker运行
  • 命令行参数环境变量
  • 『大模型笔记』WizardLM:使大型预训练语言模型能够遵循复杂的指令
  • 编程-设计模式 2:抽象工厂模式
  • 阿里云智能大数据演进
  • Java面试题———Spring篇①
  • 4章10节:用R做数据重塑,变体函数应用详解和可视化的数据预处理介绍
  • Socks5代理IP在跨境电商和网络爬虫领域的实战应用
  • 农业上的目标跟踪论文汇总
  • gpxt 小程序:轨迹合并与管理的高效工具
  • elasticsearch集成springboot详细使用
  • html+css网页制作 化妆品电商4个页面
  • 微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1
  • rust 编译时报错:type annotations needed for Box
  • 应用方案 | 低功耗接地故障控制器D4145
  • 第一次彩色pcb打样记录
  • 通过 MediatR 实现了请求的分发和处理器的解耦
  • Naive UI+vue一些组件的注意事项
  • sgetrf M N is 103040 时报错,这是个bug么 lapack and Openblas the same,修复备忘
  • [后端代码审计] PHP 数组知识汇总
  • 单点Redis中面临哪些问题
  • 数学建模--蒙特卡洛算法之电子管更换刀片寿命问题