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+zprint(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 = 0for num in numbers:total += numreturn 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 = 0for amount in fruits.values():total += amountreturn 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可以组合起来可以传入任意的参数,这在参数未知的情况下是很有效的,同时加强了函数的可拓展性。

您学废了吗?


关注公众号《AI算法之道》,获取更多AI算法资讯。

一文弄懂Python中的*args 和 **kwargs相关推荐

  1. 一文弄懂python中的函数(自定义函数,匿名函数,高阶函数与解析式)

    什么是函数,如何在 Python 程序中定义函数呢? 说白了,函数就是为了实现某一功能的代码段,只要写好以后,就可以重复利用. python中的自定义函数 Python 的函数具有非常灵活多样的参数形 ...

  2. 一文弄懂Python中的Lambda表达式

    1. 引言 不管大家是Python新手还是老手 ,一定都听说过Lambda 函数.它的语法简单而且用起来相当方便. 本文主要是介绍Python lambda 函数的,为了阅读方便,分为以下 3 个部分 ...

  3. 一文弄懂Python中的 if __name__ == __main__

    1. 引言 在Python相关代码中,我们经常会遇到如下代码段: # stuff if __name__ == "__main__":# do stuff 本文将尽可能使用简单的样 ...

  4. 一文弄懂Python中的pprint

    1. 引言 pprint的英文全称Data pretty printer,顾名思义就是让显示结果更加直观漂亮. print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是 ...

  5. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  6. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  7. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  8. 彻底弄懂Python中的GIL锁

    彻底弄懂Python中的GIL锁 转载:https://blog.csdn.net/yushuaigee/article/details/86537474 刚学习python时,我关注了许多介绍pyt ...

  9. Python中的*args和**kwargs是什么?该如何使用?

    2020-01-16 12:30:00 全文共2911字,预计学习时长9分钟 来源:Pexels 在编程中,函数就是生命! 作为使用Python的新手--无论是编程新手,还是熟悉另一语言的人--都需要 ...

最新文章

  1. 俄罗斯独特的职业***文化
  2. Unknown lifecycle phase mvn
  3. android one gm 5,Android One计划诞生,GM 5 Plus发布
  4. 科学记数法数字转换/保留数值小数点位数(数字格式化)
  5. The superclass javax.servlet.http.HttpServlet was not found 问题解决
  6. 音视频技术开发周刊 | 192
  7. Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
  8. phoenix hbase java_java jdbc访问hbase phoenix
  9. 启动u盘自动运行服务器,WinPE网启服务器自动配置程序
  10. 对称加密和非对称加密的理解
  11. 小米研发团队从400人增至3700人;iOS 13.3“杀后台”问题缓解;FreeBSD 12.1发布|极客头条...
  12. 笑傲江湖手3D游服务器端文件,武林大会即将拉开序幕《笑傲江湖3D手游》12月公测来袭...
  13. android 把数据导入到excel文件中的三种方法
  14. 远视图+五环(css练习)
  15. 南方cass字体样式设置_cass怎么修改字体 cass字体样式管理器
  16. Windows运维之道——PXE网克系统
  17. Latex学习笔记——总篇(入门、图片、表格、数学公式、伪代码、代码块、参考文献)
  18. org.hibernate.StaleStateException: Batch update returned unexpected row cou...
  19. Oralce ERP中AP模块Vender银行信息查询语句
  20. GeForce RTX 3090深度学习测评

热门文章

  1. 成功解决:Caused by: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but
  2. 设计模式——单例模式
  3. Redis事务(二)-WATCH命令的实现
  4. java中关于高聚合与松耦合
  5. 电脑中毒软件都变成java图标_当前数据表有10条记录,若用函数EOF()测试结果为.T.,此时函数RECNO()值是________。 (2.0分)_学小易找答案...
  6. 【踩坑日记】未能加载文件或程序集 log4net
  7. 教你在众多快递单号中将发出时间相同的单号筛选出来
  8. [Linux 基础] -- Linux 如何查询 OS、CPU、内存、硬盘信息?
  9. .NET使用本地Outlook邮箱指定邮箱用户名和密码发送邮件
  10. POC-T框架学习————8、相关脚本深入学习四