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表示任何多个无名参数,它是一 ...
随机推荐
- Java RestTemplate传递参数
最近使用Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑,也就是当我们把参数封装在Map里面的时候,Map 的类型选择. 使用RestTemplate post请求 ...
- 解决Spring MVC @ResponseBody出现问号乱码问题
原因是SpringMVC的@ResponseBody使用的默认处理字符串编码为ISO-8859-1,而我们前台或者客户端的编码一般是UTF-8或者GBK.现将解决方法分享如下! 第一种方法: 对于需要 ...
- vue在某页面监听键盘输入事件
需求:在某一网页,通过上下左右键控制一些操作 实现: 1.基本代码: 因为没有绑定特定的元素.所以我们将事件绑定到document上. //当前页面监视键盘输入 document.onkeydown ...
- python内置模块(一)
re模块 基本操作方法 1.使用findall方法可以根据正则表达式筛选所有符合的字符.基本句式为: re.findall('正则表达式',待匹配的字符) 结果为一个列表,没有结果为空列表. 2.使用 ...
- LuoguB2104 矩阵加法 题解
Content 给定两个 \(n\times m\) 的矩阵 \(A,B\),求 \(C=A+B\). 数据范围:\(1\leqslant n,m\leqslant 100\). Solution 我 ...
- ligerui的jquery.validate验证需要添加validate="{required:true,minlength:8,equalTo:'#newpassword'}"
ligerui的jquery.validate验证需要添加validate="{required:true,minlength:8,equalTo:'#newpassword'}"
- 权限设计的idea
1.角色增加两个字段,一级部门(如钻井事业部),党组织角色(或者团委在线角色)当然或者是其他的团委在线角色 2.增加一张表,标示在线模块(如党组织在线,团委在线,工会在线,纪检在线), 3.菜单(栏目 ...
- 【论文笔记】 Popularity Bias in Dynamic Recommendation
Popularity Bias in Dynamic Recommendation Authors: Ziwei Zhu, Yun He, Xing Zhao, James Caverlee KDD' ...
- ubuntu ffmpeg 转码错误
[aac @ 0xde2400] The encoder 'aac' is experimental but experimental codecs are not enabled, add '-st ...
- 【LeetCode】277. Find the Celebrity 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 日期 题目地址:https://leetcode ...