理解 Python 编程中 *args 与 **kwargs 的妙用

2024-03-31 10:20

本文主要是介绍理解 Python 编程中 *args 与 **kwargs 的妙用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、形式参数与实际参数
  • 二、*args 与 **kwargs
  • 三、总结

🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


在 Python 编程中,*args**kwargs两种用于函数定义时处理可变数量的参数的机制。它们分别用于处理位置参数*args)和关键字参数**kwargs)。这两个机制提高了函数的灵活性和可重用性,允许开发者编写更加通用和灵活的代码。


一、形式参数与实际参数

在 Python 编程中,理解形参(形式参数)和实参(实际参数)的概念对于掌握函数的定义和调用至关重要。下面我将详细解释这两个概念,并通过一个具体的例子来展示它们在实际编程中的应用。

形参(形式参数)

形参是在函数定义时使用的参数名。它们仅仅是标识符,用于在函数体内部引用传递给函数的值。形参没有具体的值,它们的值由函数调用时传递的实参决定。可以将形参视为函数内部使用的变量名,这些变量名将在函数调用时被赋予具体的值

实参(实际参数)

实参是在函数调用时提供给函数的具体值或变量。这些值或变量将替换函数定义中的形参,以便在函数体内进行操作。实参可以是常量、变量或者表达式等,其值在函数调用时确定,并传递给对应的形参。

形参和实参在函数定义和调用中的作用和区别

  • 作用

    • 形参:定义了函数可以接收数据的 “占位符”,允许函数根据传入的不同实参执行相应的操作。

    • 实参:向函数提供了执行操作所需的具体数据或信息。

  • 区别

    • 定义位置:形参出现在函数定义中,而实参出现在函数调用中。

    • 数据类型:形参没有具体的数据类型,它们获得类型是通过接收到的实参决定的;实参则有具体的数据类型。

    • 作用范围:形参只在函数内部有效,它们是局部变量;实参可以是全局变量、局部变量或表达式等。

下面通过一个简单的例子来说明如何在实际编程中使用形参和实参:

# 定义一个函数,计算两个数的和
# 这里 x 和 y 是形式参数(形参)
def add(x, y):result = x + yreturn result# 调用上面定义的 add 函数
# 这里 5 和 3 是实际参数(实参)
sum = add(5, 3)print("The sum is:", sum)

在这个例子中:

  • add 函数定义了两个形式参数(xy),它们在函数被调用时会接收相应的实际参数。

  • 当我们调用 add(5, 3) 时,53 是实际参数(实参),它们被传递给 add 函数,并替换了形式参数 xy 的位置。

  • 函数内部使用这些传入的值(即实际参数)进行计算,并返回结果。

通过这个例子,我们可以看到形式参数和实际参数如何配合工作,使得我们能够编写灵活且可重复使用的代码。


二、*args 与 **kwargs

*args 的用途和工作原理:

  • 实参位置参数是指那些在函数调用时按照顺序直接传递的参数,这些参数不需要指定形参名。例如,在函数调用 func(a, b, 1) 中,a、b 和 1 都是位置参数。

  • 用途*args 用于在函数定义中处理那些数量不确定的位置参数。这意味着,通过使用 *args,你可以传递任意数量的位置参数给函数。

  • 工作原理:在函数内部,args 实际上是一个元组,它包含了所有传递给函数的位置参数。单个星号(*)是以新元组形式打包实参中所有的位置参数并将新元组赋值给星号后的变量 args,即收集位置参数。

如何使用 *args:

def my_function(*args):for arg in args:print(arg)my_function(1, 2, 3, 4)     # 输出:1 2 3 4

**kwargs 的用途和工作原理:

  • 实参关键字参数则是指在函数调用时通过指定形参名来传递的参数。这些参数在传递时必须包含形参名和对应的值。例如,在函数调用 func(a=1, b=2) 中,a=1 和 b=2 都是关键字参数。

  • 用途**kwargs 用于在函数定义中处理那些数量不确定的关键字参数。这意味着,通过使用 **kwargs,你可以传递任意数量的关键字参数给函数。

  • 工作原理:在函数内部,kwargs 实际上是一个字典,它包含了所有传递给函数的关键字参数。双星号(**)是以新字典形式打包实参中的所有关键字参数并将新字典赋值给双星号后的变量 kwargs,即收集关键字参数。

如何使用 **kwargs:

def my_function(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")my_function(name="John", age=30)     # 输出:name: John age: 30

利用 *args 和 **kwargs 提高代码灵活性和可重用性:

  • 组合使用:在同一个函数中同时使用 *args**kwargs 来允许接收任意数量的位置参数和关键字参数。

  • 函数装饰器:在编写装饰器时,经常会使用 *args**kwargs 来确保装饰器对于接收可变数量的参数的函数是通用的。

  • 继承与多态:在类方法中使用 *args**kwargs 可以方便地调用父类方法,无论父类方法定义了多少参数。

示例:组合使用 *args 和 **kwargs

def my_function(*args, **kwargs):for arg in args:print(arg)for key, value in kwargs.items():print(f"{key}: {value}")my_function(1, 2, name="John", age=30)

一些注意事项:

  • 使用 *args**kwargs 可以增加函数的灵活性,允许传递任意数量的位置或关键字参数。

  • 在函数定义中,*args 必须位于 **kwargs 之前,即位置参数必须位于关键字参数之前

  • 当与其他具有默认值的参数一起使用时,请确保将默认值参数放在 *args**kwargs 前面,即默认值参数需放在位置和关键字参数前面

  • 虽然 *args**kwargs 提供了极大的灵活性,但过度使用它们可能会使代码难以阅读和维护。因此,在清楚需要处理可变数量的参数时才考虑使用它们。


三、总结

在 Python 编程里,我们可以用一些特殊的符号来帮助我们处理函数的参数。这些符号有单个星号 * 和双星号 **

  1. 如果在一个函数的形式参数(就是函数定义时括号里的参数)前面加上一个星号,比如 *args,那就意味着你可以传入很多个没有指定名字的参数,这些参数会被打包成一个元组(就像一个包裹里装了很多东西),然后这个元组会被赋值给星号后面的那个变量名(args)。同样的,如果用两个星号,比如 **kwargs,就可以传入很多带名字的参数,它们会被打包成一个字典(就像一个有很多小抽屉的柜子,每个抽屉都贴着名字),然后这个字典会赋值给双星号后面的变量名(kwargs)。

  2. 当你调用一个函数的时候,如果你前面加星号,比如 *sequence,那就是把一个序列(比如列表、元组或字符串)里面的每个元素都拿出来,作为独立的参数传给函数。如果用两个星号,比如 **dict,就是把一个字典里的每个键值对都拿出来,作为带名字的参数传给函数。

  3. 如果你不确定要传给函数多少参数,或者你有一个序列(比如列表或元组)或者字典,并且你想把它们的内容作为参数传给函数,你可以在函数定义时使用星号和双星号来接收这些参数。

  4. 当你直接传递一个列表或字典给一个函数时,如果函数内部有修改操作,那么原始的列表或字典数据会被改变。这是因为列表和字典是可变类型,当你直接传递它们时,实际上是传递了它们在内存中的地址。函数可以通过这个地址来修改原始的列表或字典数据。当你用星号或双星号把一个列表或字典传给函数时,即使在函数里面对这些参数进行了修改,原来的列表或字典是不会改变的。这就像是你把家里的东西清单给了别人,即使别人在清单上画了勾或改了东西的顺序,你家里的东西还是那样,没有变。

通过合理利用 *args**kwargs,你可以编写出既灵活又易于维护的 Python 代码。


📚️ 相关链接:

  • Python 3.5 的解包操作符

  • Python 解包操作符 —— python 打包解包

  • Python —— 一文搞懂参数 args,kwargs

这篇关于理解 Python 编程中 *args 与 **kwargs 的妙用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864100

相关文章

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态