详解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访问纯真IP数据库的代码
May 19 Python
netbeans7安装python插件的方法图解
Dec 24 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Django框架实现逆向解析url的方法
Jul 04 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python实现两张图片的像素融合
Feb 23 Python
Python如何实现转换URL详解
Jul 02 Python
python中对_init_的理解及实例解析
Oct 11 Python
Python笔记之观察者模式
Nov 20 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 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 空格,换行,跳格使用说明
2009/12/18 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
计算机求职信
2013/12/01 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
写自荐信的注意事项
2014/03/09 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
专项法律服务方案
2014/06/11 职场文书
体育节口号
2014/06/19 职场文书
2015元旦标语横幅
2014/12/09 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers