详解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实现socket客户端和服务端简单示例
Feb 24 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
浅述python2与python3的简单区别
Sep 19 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
python图形用户接口实例详解
Dec 16 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
python spilt()分隔字符串的实现示例
May 21 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
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
python黑魔法之编码转换
2016/01/25 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
详解flask入门模板引擎
2018/07/18 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
开业典礼主持词
2014/03/21 职场文书
党员四风剖析材料
2014/08/27 职场文书
在职员工证明书
2014/09/19 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
班主任经验交流材料
2014/12/16 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python