详解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之import机制详解
Jul 03 Python
Python解释执行原理分析
Aug 22 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
Numpy数组转置的两种实现方法
Apr 17 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
python机器人运动范围问题的解答
Apr 29 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
py-charm延长试用期限实例
Dec 22 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
使用Django搭建网站实现商品分页功能
May 22 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
如何解决pycharm调试报错的问题
Aug 06 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
yii实现创建验证码实例解析
2014/07/31 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
MSN消息提示类
2006/09/05 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
使用Python获取Linux系统的各种信息
2014/07/10 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
python小白切忌乱用表达式
2020/05/29 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
怎样声明接口
2014/09/19 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
会计助理岗位职责
2014/02/17 职场文书
财政专业求职信范文
2014/02/19 职场文书
《太阳》教学反思
2014/02/21 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
4s店活动策划方案
2014/08/25 职场文书
计划生育诚信协议书
2014/11/02 职场文书
国王的演讲观后感
2015/06/03 职场文书