详解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获取beautifulphoto随机某图片代码实例
Dec 18 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
使用tensorflow实现线性回归
Sep 08 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
Python PIL图片添加字体的例子
Aug 22 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
python实现门限回归方式
Feb 29 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
浅析Python requests 模块
Oct 09 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
php生成mysql的数据字典
2016/07/07 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
pyhton列表转换为数组的实例
2018/04/04 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
Python super()函数使用及多重继承
2020/05/06 Python
Python中有几个关键字
2020/06/04 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
自我鉴定范文
2013/11/10 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
我为自己代言广告词
2014/03/18 职场文书
奥运会口号
2014/06/13 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
在职员工证明书
2014/09/19 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
云冈石窟导游词
2015/02/04 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技