理解 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使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1