DAY 8. *args和**kwargs

*args:多值元组,**kwargs多值字典,他们是python函数传参时两个特殊的参数,args和kwargs并不是强制的,但习惯使用这两个,如果在函数参数列表中声明了*args,则允许传递任意多的参数,多余的参数会被以元组的形式赋给args变量,而**kwargs允许你使用没有定义的变量名,会把显式传递的参数打包成字典

def output(*args, **kwargs):print(args)print(kwargs)output('zhangsan', 'lisi', 5, 6,a=1,b=2,c=3)# ('zhangsan', 'lisi', 5, 6)
# {'a': 1, 'b': 2, 'c': 3}

如果函数还有别的参数,传递参数时会从左到右依次对照赋值,所以请务必把*args**kwargs放在函数参数列表的最后,否则会抛出TypeError异常,并且*args必须放在**kwargs前面,正确的参数顺序应该是

def fun(arg, *args, **kwargs):pass

在调用函数时也可以使用***

def put(a, b, c):print(f'a={a},b={b},c={c}')put(*mylist)  # a=aardvark,b=baboon,c=cats = {'a': 1, 'b': 2, 'c': 3}
put(**s)  # a=1,b=2,c=3

之所以能实现这样的功能,原理是序列解包,下面简单介绍序列解包

>>> s = "ABCDE"
>>> a,b,c,d,e = s
>>> a,c
('A', 'C')>>> t = (1,2,3,4,5)
>>> a1,b1,c1,d1,e1 = t
>>> a1,c1
(1, 3)

上面就是用到了序列解包,左右两端的元素个数必须相等,否则会抛出ValueError异常

>>> a2,b2 = s
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>a2,b2 = s
ValueError: too many values to unpack (expected 2)

但总不能所有序列都一一对应把,如果序列有很多位或不确定有多少位时使用序列解包就显得很不方便了,这时候就可以使用*和了

>>> a3,*a4 = s
>>> a3,a4
('A', ['B', 'C', 'D', 'E'])
>>> while s:f,*s = sprint(f,s)A ['B', 'C', 'D', 'E']
B ['C', 'D', 'E']
C ['D', 'E']
D ['E']
E []

参考文章:

详解Python序列解包(4)

stack overflow

从一个例子看Python3.x中序列解包

GitHub python面试题

python *args和**kwargs以及序列解包相关推荐

  1. 【Python】序列解包 and * 和 ** 的区别

    可以使用序列解包功能对多个变量进行赋值. 序列解包也可以用于列表和字典,但对字典使用时,默认是对字典的"键"进行操作: 如果需要对"键:值"进行操作,需要使用字 ...

  2. python正确的赋值语句-Python 赋值语句技巧之序列解包

    python赋值语句技巧之序列解包sequence unpacking,是python语言赋值语句的一种技巧方法,在给多个python 变量命名同时赋值时是很有效率的一种方法. 赋值语句序列解包概念 ...

  3. python 链式比较 2._特色的Python序列解包、链式赋值、链式比较

    一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...

  4. python 序列解包(解压缩)

    所学的解压缩 如果我们给出一个列表,我们需要一次性取出多个值,我们是不是可以用下面的方式实现呢? name_list = ['nick', 'egon', 'jason'] x = name_list ...

  5. 微课|中学生可以这样学Python(5.7节):序列解包

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第5章  Python序列及应用 5.7  序列解包 京东购买链接:https://item.jd ...

  6. 详解Python序列解包(5)

    如果一个函数需要以多种形式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后是两个星号的可变长度参数:调用函数时,一般也按照这个顺序进行参数传递.调用函 ...

  7. 详解Python序列解包(4)

    本文主要介绍调用函数传递参数时序列解包的用法.在定义函数时在形参前面加2个星号**表示可变长度参数,可以收集若干关键参数形式的参数传递并存放到一个字典之中.与之相对,如果实参是个字典,可以使用两个星号 ...

  8. 详解Python序列解包(3)

    本文主要介绍调用函数传递参数时序列解包的用法.在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一种用法,第二种用法后面再单独发文介绍. ...

  9. 详解Python中的序列解包(2)

    8个月前曾经发过一篇关于序列解包的文章,见详解Python序列解包,本文再稍作补充. 可以说,序列解包的本质就是把一个序列或可迭代对象中的元素同时赋值给多个变量,如果等号右侧含有表达式,会把所有表达式 ...

最新文章

  1. IDEA 不能显示项目里的文件结构
  2. Linux中top命令的用法详解
  3. VC++简单实现工具软件随鼠标移动画线的功能
  4. 每天一道LeetCode-----复制无向图
  5. 数据库性能(一):数据库索引原理解析
  6. Graphics.DrawRectangle Method(矩形)
  7. 解决文件上传_使用FastDfs上传头像上传不成功的问题---SpringCloud Alibaba_若依微服务框架改造---工作笔记002
  8. 那些年,我们一起玩过的响应式布局
  9. 卡巴斯基KEY文件的类型选择
  10. Easyui 默认图标以及自定义图标
  11. python同花顺交易接口_TradeApi为A股程序化交易接口2.9.0发布
  12. python生成excel文件二维码_Python实现读取Excel表内容批量生成二维码
  13. Android基础篇 读取 Assets 文件夹中的文件
  14. python中spider的用法_Scrapy Spider类的用法
  15. 智慧灯杆新功能:微雾降尘
  16. Complier Validation via Equivalence Modulo Inputs
  17. php源码 拼车网顺风车_php版某拼车网源码分享 微信拼车打车约车源码 微信拼车+手机拼车+双终端+发布平台...
  18. 网络舆情信息整理分析怎么有效做好的方法
  19. 2021年三季度中国服装家纺行业A股上市企业营收排行榜:海澜之家业绩突出,再度蝉联榜单TOP1(附热榜TOP61详单)
  20. 数学推理相关的几个名词及LaTeX用法

热门文章

  1. vue 各组件 使用 Demo
  2. Django权限系统auth模块详解
  3. tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
  4. PHP 函数截图 哈哈哈
  5. C#将dll打包到程序中
  6. 网页图表Highcharts实践教程之标签组与载入动画
  7. 实验3 --俄罗斯方块 with 20135335郝爽
  8. 新浪微博之XSS蠕虫脚本源码讲解
  9. 如何:将 TraceSource 和筛选器与跟踪侦听器一起使用(转载)
  10. JS内存管理与垃圾回收