理解 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生成随机唯一id的几种实现方法

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

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

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

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

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

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker