python进阶(小白也能看懂)——*args与**kwargs的使用

第一篇

理解*args与**kwargs在定义函数时的作用

假设你写了一个函数multiply(函数定义在下面),专门用来处理两个数相乘,即输入两个数(如2,3)到函数中,函数返回两个函数的相相乘结果,即6。

def multiply(a,b):
# 返回两个数相乘的结果return a*b

现在如果需要处理三个数相乘,那么我们就需要调用2次multiply函数,如果需要处理n个数相乘,就需要调用n-1次multiply函数,这样是不是很麻烦?
这里*args就起到了作用。我们可以将函数定义成如下:

def multiply(*args):
# 返回n个数相乘的结果res = 1for nb in args:res *= nbreturn res
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)

通过上面的例子可以知道,当不知道函数使用者传递多少个参数时,*args可以接收任意多个参数,并且*args只能处理非键值对参数,键值对参数需要使用**kwargs来处理。(注意:这里重要的并不是args,而是单个*号,我们可以使用*a,*b,*c等等等等。


理解了*args在定义函数时的作用,那么也非常容易理解**kwargs。**kwargs与*args的作用类似,只不过是在接收键值对参数时才被使用。举个例子:

def print_kwargs(**kwargs):print(kwargs)print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

同理,这里重要的并不是kwargs,而是**,我们可以使用**a,**b,**c等等等等。

顺序问题

这里还有一个顺序问题,即当我们在定义函数时,如果同时需要用到*args与**kwargs应该如何决定他们的顺序。
书写顺序如下:

  1. 一般参数
  2. *args
  3. 关键字参数
  4. **kwargs
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):

理解*args与**kwargs在调用函数时的作用

我们也可以在传递参数给函数时使用*args和**kwargs。例子:

def some_args(arg_1, arg_2, arg_3):print("arg_1:", arg_1)print("arg_2:", arg_2)print("arg_3:", arg_3)args = ("Sammy", "Casey", "Alex")
some_args(*args)

这里我们首先定义args为一个元祖变量,然后使用*语法将args的值传递给函数。
注意:这里args内的元素个数必须与函数定义的参数个数相同,否则会发生TypeError: some_args() missing 1 required positional argument: 'arg_3'等错误。

同样,**kwargs也可以这样使用。

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):print("kwarg_1:", kwarg_1)print("kwarg_2:", kwarg_2)print("kwarg_3:", kwarg_3)kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)

总结

*args与**kwargs既可以定义在函数中接收任意个参数,又可以作为参数传递给函数。

参考资料

链接:How To Use *args and **kwargs in Python 3

python进阶(小白也能看懂)——*args与**kwargs的使用相关推荐

  1. python进阶(小白也能看懂)——装饰器浅谈(一)

    python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...

  2. python进阶(小白也能看懂)——Map、Filter、Reduce

    python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...

  3. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  4. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

  5. armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...

    小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...

  6. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  7. c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...

    原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...

  8. 小白也能看懂的网络基础 | 01 什么是网络?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

  9. 小白也能看懂的网络基础 | 02 什么是连接设备?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

最新文章

  1. 升级python2.6.6到python2.7导致pip命令不可用
  2. Qt Example各例子演示功能说明
  3. windows运行linux脚本命令大全,查看和运行 Windows PowerShell 脚本
  4. 决策树有框架吗_决策框架
  5. SpringBoot系列: CommandLineRunner接口的用处
  6. 归并排序的java语言_归并排序 java语言
  7. 零基础python数据分析自学_零基础的人,怎么自学数据分析?
  8. 电脑qq空间,qq空间电脑版
  9. 初探 Linux操作系统 (一):站在巨人的肩膀上
  10. The Pursuit of Happyness 当幸福来敲门(励志电影推荐)
  11. 下图是微型计算机cpu的结构图它由控制器,下图是微型计算机CPU的结构图,它由控制器、( )、寄存器等构成。...
  12. 电脑知识 小技巧汇总
  13. 程序员面试还不敢要高薪资?程序员面试谈薪资的6大技巧分享,最全Java架构师技能图谱
  14. vcruntime140.dll下载【vcruntime140.dll丢失的解决方法】
  15. GUI Design Studio----如何使用位图图像
  16. mysql 一对多 右表多条记录合并_MYSQL 单表一对多查询,将多条记录合并成一条记录...
  17. P2-21js-ajax
  18. 重磅!一行代码轻松搞定中英文语音识别与语音合成|代码开源!
  19. android gif第三方,Gboard个性化GIF定制功能终于登陆Android客户端
  20. 台式计算机怎样时间同步,台式机电脑时间总是不对怎么办

热门文章

  1. 【疑问】SD更新凭证流
  2. 【PM模块】PM模块主数据
  3. ABAP 字符串操作
  4. PP生产订单的BADI增强 WORKORDER_UPDATE
  5. ALV分类合计功能实现
  6. 什么?口红输给口罩了?
  7. c语言程序可以单独编译,c语言中的函数可不可以单独进行编译?_后端开发
  8. gophp解释器_对比平台--Go和PHP之间的区别
  9. xenserver 虚拟机扩容lvm磁盘分区的方法_从零开始学Linux运维|35.LVM(逻辑卷管理)的创建...
  10. python爬虫 -- 正则表达式 与 Re模块的介绍