详解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深入学习之特殊方法与多范式
Aug 31 Python
python中的错误处理
Apr 10 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
用tensorflow搭建CNN的方法
Mar 05 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
python使用递归的方式建立二叉树
Jul 03 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
python中def是做什么的
Jun 10 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python极值整数的边界探讨分析
Sep 15 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数组操作汇总 php数组的使用技巧
2011/07/17 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
简单的自定义php模板引擎
2016/08/26 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python函数参数类型*、**的区别
2015/04/11 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
python获取中文字符串长度的方法
2018/11/14 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
Python File(文件) 方法整理
2019/02/18 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
tensorflow 环境变量设置方式
2020/02/06 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
财务会计专业推荐信
2013/11/30 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
土地转让协议书
2014/04/15 职场文书
介绍信样本
2015/01/31 职场文书
村主任当选感言
2015/08/01 职场文书
体育教师教学随笔
2015/08/15 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
python在package下继续嵌套一个package
2022/04/14 Python