详解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中的yield使用方法
Feb 11 Python
Python类定义和类继承详解
May 08 Python
python如何读写csv数据
Mar 21 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
python仿抖音表白神器
Apr 08 Python
Django模板语言 Tags使用详解
Sep 09 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
Python实现手势识别
Oct 21 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
Python绘制地图神器folium的新人入门指南
May 23 Python
Python合并pdf文件的工具
Jul 01 Python
Python使用DFA算法过滤内容敏感词
Apr 22 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
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
Javascript缓存API
2016/06/14 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
python文件比较示例分享
2014/01/10 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
Java的类与C++的类有什么不同
2014/01/18 面试题
借款担保书范文
2014/05/13 职场文书
财政局个人年终总结
2015/03/03 职场文书
整改通知书格式
2015/04/22 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript