详解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创建文件和追加文件内容实例
Oct 21 Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
Python中使用HTMLParser解析html实例
Feb 08 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Python数据结构之翻转链表
Feb 25 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python实现猜数字游戏
Mar 25 Python
python:动态路由的Flask程序代码
Nov 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
Zend的MVC机制使用分析(二)
2013/05/02 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
浅谈PHP进程管理
2019/03/08 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python绘制数码晶体管日期
2021/02/19 Python
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
机电一体化专业推荐信
2013/12/03 职场文书
关于人生的感言
2014/01/17 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
村官工作鉴定评语
2014/01/27 职场文书
防卫过当辩护词
2015/05/21 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技