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表示任何多个无名参数,它是一 ...
随机推荐
- 关于导入Eclips Web项目报错的解决方案
1.是一定要有耐心,耐心,耐心,重要的事情说三遍.针对问题一 一破解,一步一步来,不要放弃. 2.其实百度就好了他们有报错的各种问题及解决方案 ,包括导入项目web.xml报错,js文件,jsp文件报 ...
- 可扩展标记语言XML(淅淅沥沥的小雨)
XML简述 XML用于描述数据,是当前处理结构化文档信息的有力工具.与操作系统编程语言的开发平台无关,可以实现不同系统之间的数据交互. xml文件结构: 1 <?xml version=&quo ...
- Docker从入门到精通(三)——概念与执行流程
前面我们大概介绍了docker是什么以及如何安装docker,但是对里面出现的一些名词,可能大家还不熟悉,这篇文章就来为大家解惑. 1.容器化平台 Docker 是提供应用打包,部署与运行应用的容器化 ...
- shell脚本 awk实现查看ip连接数
一.简介 处理文本,是awk的强项了. 无论性能已经速度都是让人惊叹! 二.使用 适用:centos6+ 语言:英文 注意:无 awk 'BEGIN{ while("netstat -an& ...
- outlook2007邮件里的图片显示不出来
outlook2007邮件里的图片显示不出来,这是为啥? 以图片为附件的形式进行传送吧,这样在收件箱里就能在线看图片了,不用担心看不到图片
- JAVA上传文件到FTP上
添加maven <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> ...
- 安装选择msi格式还是zip(windows下Nodejs zip版下载安装及环境变量配置)
安装选择msi格式还是zip((windows下Nodejs zip版下载安装及环境变量配置)) -----以node.js 安装为例: 1,外观对比: ✿ 简单介绍一下node的作用: • node ...
- RPA培训:RPA的核心三个组件常见部署方式(RPA学习天地)
整体架构 目前主流厂商的RPA平台就是由控制台.设计器和机器人这三个标准套件组成,这三个核心套件形成了RPA产品的基本要素.其它如AI平台.人机交互.流程挖掘.自动化中心等都是衍生出来的周边产品. 1 ...
- ffmpeg、数字音频教程、JUCE、std::tuple
下载网易云音乐的视频 https://yunyinyue.iiilab.com/ 模板教程: https://github.com/wuye9036/CppTemplateTutorial/blob/ ...
- C语言补漏-逗号运算符与逗号表达式
1. 新名词? 今天看到一个新名词: 逗号表达式. C语言就有.额,怎么当时学习C没见过,一头雾水. 对我来说是新名词,其实它早就存在了,只是我还不知道. 2. 逗号表达式 C语言提供了逗号运算符-- ...