详解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函数的笔记整理
Apr 07 Python
python实现汉诺塔方法汇总
Jul 25 Python
Python使用pymysql小技巧
Jun 04 Python
Python代码实现KNN算法
Dec 20 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
在自动化中用python实现键盘操作的方法详解
Jul 19 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
python字符串的index和find的区别详解
Jun 20 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 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 魔术方法使用说明
2009/10/20 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP使用函数用法详解
2018/09/30 PHP
php7性能提升的原因详解
2019/10/13 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
js实现小星星游戏
2020/03/23 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
介绍一下write命令
2012/09/24 面试题
小组合作学习反思
2014/02/18 职场文书
继承权公证书
2014/04/09 职场文书
单位工作证明格式模板
2014/10/04 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
基于Redis位图实现用户签到功能
2021/05/08 Redis
Vue实现下拉加载更多
2021/05/09 Vue.js
HDFS免重启挂载新磁盘
2022/04/06 Servers