详解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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
python关闭windows进程的方法
Apr 18 Python
Python简单计算文件夹大小的方法
Jul 14 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
详解python3中tkinter知识点
Jun 21 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
PyTorch中permute的用法详解
Dec 30 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 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极大的增强功能和性能
2006/10/09 PHP
初探PHP5
2006/10/09 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php-fpm配置详解
2014/02/12 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js中的this关键字详解
2013/09/25 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
python动态网页批量爬取
2016/02/14 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python交易记录链的实现过程详解
2019/07/03 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
机电专业大学生职业规划书范文
2014/02/25 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
青年志愿者活动方案
2014/08/17 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
青年文明号汇报材料
2014/12/23 职场文书
婚宴领导致辞
2015/07/28 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL