python 中的 *args 和 **kwargs
在阅读Python代码时,经常会看到如下函数的定义:
def fun(*args, **kwargs):
很多同学可能会对此感到困惑,这个 * args和 **kwargs是什么东西、为啥会在源码中应用的这么管阿帆呢?
这就要从函数的参数说起了,函数在传参时通常分为四种情况:
1、普通参数:即在调用函数时必须按照准确的顺序来进行传递。
2、默认参数:即参数含有默认值、在调用函数时可以进行参数传递、若没有进行参数传递则使用默认值,要注意,默认参数必须在普通函数的右侧,(否则解释器无法解析)。
3、元组参数:即*args,参数格式存储在一个元组中,长度没有限制,必须位与普通函数和默认参数之后。
4、字典参数:**kwargs,参数格式化存储在一个字典中,必须位与参数列表的最后面
普通参数实例如下,在调用函数的时候必须传入参数,否则会抛出TypeError异常:
def fun(name);
print "Hello:", name fun('Python')
默认参数必须跟在普通参数之后,不能在普通参数之前,默认参数可以穿值,也可以不传,不传值时就采用默认参数;
def fun(base, rate=0.1):
return base + base*rate fun() fun(, 0.2)
元组参数需要跟在普通参数默认参数的后面,其最大的特点就是不限制长度:
def fun(arg1, arg2='Default', *args):
print('arg1:', arg)
print('arg2:', arg2)
for eacharg in args:
print('tuple:', eacharg) fun('Python')
fun('Python', 'Excellent')
fun('Python', 'Excellent', 'I', 'love', '100', 'Years')
最后一次调用的结果为:
arg1: Python
arg2: Excellent
tuple arg: I
tuple arg: Love
tuple arg: Python
tuple arg: 100
tuple arg: Years
由此可见,元组的长度是不可受限制的
字典参数必须跟在其它参数后面,并且长度也是不手限制的;
def fun(arg1, arg2 = 'Default', *args, **kwargs):
print('arg1:', arg1)
print('arg2:', arg2) for eacharg in args:
print('tuple arg:', eacharg) for eachkwarg in kwargs.keys():
print('dict arg', eacharg, ':', kwarg[eachkwarg]) fun('Python', 'Excellent', 'I', 'Love', 'You', language = 'Python', number = , time = 'Years')
运行的输出结果为:
arg1: Python
arg2: Excellent
tuple arg: I
tuple arg: Love
dict arg number : 100
dict arg language : Python
dict arg time : Years
当我们将普通参数和默认参数放到元组或者字典参数中时,函数的定义就变为仅仅剩余元组和字典参数了:
def fun(*args, **kwargs): for eacharg in arg: print('tuple arg:', eacharg) for eachkwarg in kwargs.keys(): print('dict arg:', eachkwarg, ":", kwargs[eachkwarg]) fun('Python', 'Excellent', 'I', 'Love', '', 'You',language = 'Python', number = , time = 'Years')
这也是很多源码中对函数的定义。运行结果输出为:
tuple arg: Python
tuple arg: Excellent
tuple arg: I
tuple arg: Love
dict arg number : 100
dict arg language : Python
dict arg time : Years
所有的参数均可以正确获取
运行的输出结果为:
arg1: Python
arg2: Excellent
tuple arg: I
tuple arg: Love
dict arg number : 100
dict arg language : Python
dict arg time : Years
python 中的 *args 和 **kwargs的更多相关文章
- 理解 Python 中的 *args 和 **kwargs
Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...
- Python中的*args和**kwargs
原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...
- Python中的 *args 和 **kwargs
基本概念 Python支持可变参数,最简单的方法莫过于使用默认参数. def test_defargs(one, two=2): # 参数one没有默认值,two的默认值为2 print('Requi ...
- Python中的*args和**kwargs的理解与用法
一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...
- Python中的args和kwargs
有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...
- python中的*args与**kwargs的含义与作用
在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kwargs是关键字参数 (字典)例如下面的代 ...
- python中应用*args 与**kwargs
这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...
- python中,*args和**kwargs这两个参数的作用是什么?
*args和**kwargs这两个都是不定长参数,可以解决函数中参数不固定的问题,*args可以把位置参数转化成元组,**kwagrs可以把关键字参数转化成字段
- python中“*”、"*args"、"kwargs"三种用法
参考链接:https://www.cnblogs.com/cwind/p/8996000.html 注意的是: (1)"*"符号的用法很类似C++中的指针,针对列表; (2)&qu ...
随机推荐
- PostgreSQL日期加减
在PostgreSQL中可以直接对时间进行加减运算:. SELECT now()::timestamp + '1 year'; --当前时间加1年 SELECT now()::timestamp + ...
- Android学习09
SharedPreferences SharedPreferences,是一种轻量级的数据存储方式,采用Key/value的方式 进行映射,Sp通常用于记录一些参数配置.行为标记等! 1.获得mSha ...
- JavaScript学习笔记之二
一 js与json数据格式的转换:序列号与反序列化 JSON.stringify(jsobj, ' ');//将js的obj转换为json对象: JSON.parse()把json对象变成一个Jav ...
- MySQL基本查询
1.查询某数据库中表的总数 select count(*) from information_schema.tables where table_schema='dbname'; 2.仅占一列显示某数 ...
- mysql中utf8字符集的设置及character_set_database属性修改
mariadb配置文件修改字符集: [mysqld] atadir=/usr/local/mysql/datasocket=/tmp/mysql.sock # Disabling symbolic-l ...
- Java工作流引擎关于数据加密流程(MD5数据加密防篡改)
关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单 拖拽式表单 工作流系统 流程数据加密 md5 数据保密流程数据防篡改 ...
- 安卓开发:初步了解布局文件layout
了解完项目的目录结构,主要文件的作用之后. 了解完各常量文件的定义和使用之后,接下来的重头戏肯定是布局文件layout. 果然,网上关于“安卓布局文件layout”的各种介绍.解析.深入分析,等等资料 ...
- 【SSM sql.xml】日志查询mapper.xml
LogInfoMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapp ...
- htmlunit的使用
原文转自:https://www.cnblogs.com/davidwang456/articles/8693050.html HtmlUnit使用场景 httpClient的局限性 对于使用java ...
- Es查询结果集默认是10000,更新设置
Es查询结果集默认是10000,结果集大小是int,最大为21亿左右 PUT _all/_settings?preserve_existing=true { "index.max_resul ...