理解 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中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需