详解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类的基础入门知识
Nov 24 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
Tensorflow 查看变量的值方法
Jun 14 Python
python中强大的format函数实例详解
Dec 05 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
python3 logging日志封装实例
Apr 08 Python
Python实现计算图像RGB均值方式
Jun 04 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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获取twitter最新消息的方法
2015/04/14 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
高三历史教学反思
2014/01/09 职场文书
春游踏青活动方案
2014/08/14 职场文书
优秀英文求职信范文
2015/03/19 职场文书
学校开除通知书
2015/04/25 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL