详解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 抓取动态网页内容方案详解
Dec 25 Python
Python实现批量下载文件
May 17 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
opencv python如何实现图像二值化
Feb 03 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
python3中TQDM库安装及使用详解
Nov 18 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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
深入密码加salt原理的分析
2013/06/06 PHP
php中如何执行linux命令详解
2018/11/06 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
vue按需加载实例详解
2019/09/06 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python常见的格式化输出小结
2016/12/15 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
详解Python3注释知识点
2019/02/19 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
python 如何调用 dubbo 接口
2020/09/24 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
优秀校长事迹材料
2014/12/24 职场文书
实习生个人总结范文
2015/02/28 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
食堂卫生管理制度
2015/08/04 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书