详解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改变日志(logging)存放位置的示例
Mar 27 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
python for 循环获取index索引的方法
Feb 01 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
python设置环境变量的作用和实例
Jul 09 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Python搭建HTTP服务过程图解
Dec 14 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
Python图像识别+KNN求解数独的实现
Nov 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
wamp安装后自定义配置的方法
2014/08/23 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
List the Codec Files on a Computer
2007/06/11 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
微信小程序日历插件代码实例
2019/12/04 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
Python下的twisted框架入门指引
2015/04/15 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
表彰先进集体通报
2014/01/12 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
工作能力自我评价2015
2015/03/05 职场文书
PHP正则表达式之RCEService回溯
2022/04/11 PHP