详解Python中*args和**kwargs的使用


Posted in Python onApril 07, 2022

1. 引言

在本文中,我们将讨论 Python 中的 *args 和 **kwargs 及其用法和示例。

闲话少说,我们直接开始吧。

2. 问题引入

在Python中写函数的时候,我们经常需要给函数传值,这些值被称为函数参数。

我们不妨来举个栗子,我们实现加法运算如下:

def add(x,y):
    return x+y
print(add(2,3))

输出:

5

如果进一步来说,我们需要实现三个数字求和的操作呢?很简单,我们可以修改函数以接受三个参数并将它们的总和返回,代码如下:

def add(x, y, z):
    return x+y+z

print(add(2, 3, 5))

输出:

10

如果此时我们又需要对四个数字求和呢?如果又变成五个数字求和呢?

当我们有可变数量的参数时,就会出现问题。我们是否应该继续修改函数以接受确切数量的参数?当然不是,我们不会这样做。实际上,以上场景为*args 和 **kwargs大显身手的地方。

3. Python中的*args

*args 允许我们将可变数量的参数传递给 Python中相应的函数。在函数中,我们应该在参数名称前使用 * 来表示传递可变数量的参数。

样例代码如下:

def add(*args):
    print(args, type(args))
add(2, 3)

输出如下:

(2, 3) <class 'tuple'>

因此,我们确定这些传递的参数在函数内部创建了一个元组,接着我们就可以据此来写相应的加法函数,如下所示:

def add(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total

调用代码如下:

print(add(2, 3))
print(add(2, 3, 5))
print(add(2, 3, 5, 7))
print(add(2, 3, 5, 7, 9))

输出如下:

5
10
17
26

需要注意的是,上述函数的参数的名称不一定是 args,它可以是任何其他名字,在上述代码中,它是numbers,但是通常的做法就是使用 *args 作为函数参数名称来表示该参数是一个可变数量的参数。

4. Python中的**kwargs

kwargs 是 keyword arguments 的缩写,表示关键字参数。** kwargs 允许我们将可变数量的关键字参数传递给 Python函数。在函数中,我们在参数名称前使用双星号 ** 来表示这种类型的参数。

样例代码如下:

def total_fruits(**kwargs):
    print(kwargs, type(kwargs))
total_fruits(banana=5, mango=7, apple=8)

输出如下:

{'banana': 5, 'mango': 7, 'apple': 8} <class 'dict'>

此时我们可以看到,在上述情况下,字典作为参数进行传递,并且这些参数在函数内部创建了一个字典,接着,我们可以实现函数 total_fruits() 用以返回水果的总数。

def total_fruits(**fruits):
    total = 0
    for amount in fruits.values():
        total += amount
    return total

调用代码如下:

print(total_fruits(banana=5, mango=7, apple=8))
print(total_fruits(banana=5, mango=7, apple=8, oranges=10))
print(total_fruits(banana=5, mango=7))

输出如下:

20
30
12 

需要注意的是,参数的名称不一定是 kwargs,它可以是任何名字,在上述代码中,它是**fruits。但是通常的做法就是使用 **kwargs 作为函数参数名称来表示该参数是一个可变数量的关键字参数。

5. 总结

args和kwargs可以组合起来可以传入任意的参数,这在参数未知的情况下是很有效的,同时加强了函数的可拓展性。

到此这篇关于详解Python中*args和**kwargs的使用的文章就介绍到这了,更多相关Python *args  **kwargs内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python实现泊松图像融合
Jul 26 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
Django ModelForm组件使用方法详解
Jul 23 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
使用python实现名片管理系统
Jun 18 Python
浅谈Python类的单继承相关知识
May 12 Python
python实现A*寻路算法
Jun 13 Python
Python列表的索引与切片
Apr 07 #Python
Python字符串的转义字符
Python字符串格式化方式
Apr 07 #Python
Python中re模块的元字符使用小结
Python基本知识点总结
Apr 07 #Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 #Python
Python OpenCV实现图像模板匹配详解
You might like
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
php验证session无效的解决方法
2014/11/04 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
vue中实现左右联动的效果
2018/06/22 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
Python实现购物车程序
2018/04/16 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
教师实习的自我鉴定
2013/10/26 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
摄影展策划方案
2014/06/02 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
vue修饰符.capture和.self的区别
2022/04/22 Vue.js