Python中*args 和**kwargs作为形参和实参时的功能详解
*args 和**kwargs作为形参
*args 和**kwargs作为形参被称为不定长参数,用来处理超出必备参数部分的参数。注意:args和kwargs可以修改为其它变量名。
必备参数就是在定义函数时传入的形参,在调用函数时,传入的参数须以正确的顺序传入,传入的数量必须和声明时的一样,不然会出现语法错误。
以下为必备参数语法错误实例:
def student(name, age):
print(name, age) student()
"""
Traceback (most recent call last):
File "D:/test.py", line 5, in <module>
student()
TypeError: student() missing 2 required positional arguments: 'name' and 'age'
""" student("张三", 11, 99)
"""
Traceback (most recent call last):
File "D:/test.py", line 5, in <module>
student("张三",11, 99)
TypeError: student() takes 2 positional arguments but 3 were given """
当传入的参数超出必备参数时,若不想出现语法错误,可以使用不定长参数来接收这些多余的参数,若多余的参数类型为值(值为自定义说法,指的是没有”=“连接,单独的一个值,这个值可以是任何类型str,list,dict等),则被*args以元组类型接收,
若多余的参数类型为键值(键值为自定义说法,指的是一个参数用”=“连接一个值,这个值可以是任何类型str,list,dict等),则被**kwargs以字典类型接收。
def student(name, age, *args, **kwargs):
print("必备参数:", name, age)
print("多余的“值”参数:", args)
print("多余的“键值”参数:", kwargs) student("张三", 11, 22, [33, 44], {"语文": 55}, score=66, evaluation={"数学": "优"}) """
输出结果如下:
必备参数: 张三 11
多余的“值”参数: (22, [33, 44], {'语文': 55})
多余的“键值”参数: {'score': 66, 'evaluation': {'数学': '优'}}
"""
*args 和**kwargs作为实参
接收到这些多余的参数,怎么传递给其它函数用呢?传递时是使用带星的还是不带星呢?
先看不带*的实例:
def summary_student(name, *score, **evaluation):
print("-"*20)
print("必备参数:", name)
print("多余的“值”参数:", score)
print("多余的“键值”参数:", evaluation) def student(name, age, *args, **kwargs):
print("args变量的值:", args)
print("kwargs变量的值:", kwargs)
summary_student(name, age, args, kwargs) student("张三", 11, 22, [33, 44], {"语文": 55}, score=66, evaluation={"数学": "优"}) """
输出结果如下:
args变量的值: (22, [33, 44], {'语文': 55})
kwargs变量的值: {'score': 66, 'evaluation': {'数学': '优'}}
--------------------
必备参数: 张三
多余的“值”参数: (11, (22, [33, 44], {'语文': 55}), {'score': 66, 'evaluation': {'数学': '优'}})
多余的“键值”参数: {}
"""
从上面实例多余的参数分析,多余参数传递给其它函数使用时,若不带*,实际上就是把变量args整个元组当成一个值传递给其它函数使用,同理kwargs也会被当做一个值处理。
在看下带*的实例:
def summary_student(name, *score, **evaluation):
print("-"*20)
print("必备参数:", name)
print("多余的“值”参数:", score)
print("多余的“键值”参数:", evaluation) def student(name, age, *args, **kwargs):
print("args变量的值:", args)
print("kwargs变量的值:", kwargs)
summary_student(name, age, *args, **kwargs) student("张三", 11, 22, [33, 44], {"语文": 55}, score=66, evaluation={"数学": "优"}) """
输出结果如下:
args变量的值: (22, [33, 44], {'语文': 55})
kwargs变量的值: {'score': 66, 'evaluation': {'数学': '优'}}
--------------------
必备参数: 张三
多余的“值”参数: (11, 22, [33, 44], {'语文': 55})
多余的“键值”参数: {'score': 66, 'evaluation': {'数学': '优'}}
"""
从上面实例多余的参数分析,多余参数传递给其它函数使用时,若带*,其它函数处理时,全部按原传入参数的类型处理,原传入参数为”值“类型就让其它函数的*args接收,原传入参数为"键值"类型就让其它函数的**kwargs接收。
也就是说 *args 和**kwargs作为实参时,具有拆包的作用。
Python中*args 和**kwargs作为形参和实参时的功能详解的更多相关文章
- python字典(dictionary)使用:基本函数code实例,字典的合并、排序、copy,函数中*args 和**kwargs做形参和实参
python字典dictionary几个不常用函数例子 一.字典声明 如,d={}; d= {'x':1,'b':2} d1 = dict(x=1,y=2,z=3) d2 = dict(a=3 ...
- python 中*args 和 **kwargs
简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...
- python 中 *args 和 **kwargs 的区别
在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思.*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型.下文举例说明 ...
- Python中 *args 和 **kwargs 的区别
先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...
- python中*args和**kwargs学习
*args 和 **kwargs 经常看到,但是一脸懵逼 ,今天终于有收获了 """ python 函数的入参经常能看到这样一种情况 *args 或者是 **kwargs ...
- Python中 *args 和 **kwargs 的含义?
答:在python中,*args和**kwargs通常使用在函数定义里.*args 和 **kwargs 都允许你给函数传不定数量的参数,即使在定义函数的时候不知道调用者会传递几个参数.ps: *ar ...
- python 中 *args he **kwargs的区别
''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...
- Python中*args 和**kwargs的用法
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...
- Python中*args和**kwargs 的简单使用
# 在函数定义中使用*args和kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); kwargs用作传递键值可变长参数列表# *args表示任何多个无名参数,它是一 ...
随机推荐
- 莫烦python教程学习笔记——learn_curve曲线用于过拟合问题
# View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...
- Mysql脚本 优化检测
下载地址: wget https://launchpad.net/mysql-tuning-primer/trunk/1.6-r1/+download/tuning-primer.sh 安装依赖: y ...
- LuoguP7869 「Wdoi-4」使用三个系统程度的能力 题解
Content 现在有一个转换后的文本文件,以一个长度为 \(n\) 的字符串表示.请判断这个文件是用哪一种写的,详情请返回题面. 数据范围:\(n\leqslant 10^5\).字符串里面至少有一 ...
- CF1490D Permutation Transformation 题解
Content 给定一个排列 \(a\),按照以下方法构造一棵树: 选择当前排列中的最大数作为根的编号. 最大数左边的所有数按照上述方法建左子树,若没有数则该节点没有左儿子. 最大数右边的所有数按照上 ...
- NAT各种模式
https://blog.csdn.net/u011245325/article/details/9294229
- X-Tim开发日志
1.X-Tim--------一个极客风的手表 引言 很久之前就看到FASTSHIFT,但是水平太差,可是又想做一个这样的手表,于是在学习了FASTSHIFT的页面管理之后,也开始了X-Tim的制作. ...
- JAVA导入(读取)Excel中的数据(支持xls与xlsx文件)
一.导入jar包 poi-3.7.jarpoi-scratchpad-3.7.jarpoi-examples-3.7.jarpoi-ooxml-3.7.jarpoi-ooxml-schemas-3.7 ...
- LocalDateTime与Date相互转换
LocalDateTime 转 Date LocalDateTime localDateTime=LocalDateTime.now() Date date = Date.from(localDate ...
- soundcloud to mp3
关于 本文将介绍一个在线网站,将songs 下载为mp3格式 注意, 大陆需要梯子. 没有?soundcloud无法打开 准备 soundcloud to mp3 一个来自soundcloud的歌曲链 ...
- ubuntu无法找到ifconfig(command not found: ifconfig)
演示环境 $ uname -a Linux xxxxx-xxxxx-xxxx5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x8 ...