博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 拓展之 *args & **kwargs
阅读量:5906 次
发布时间:2019-06-19

本文共 1840 字,大约阅读时间需要 6 分钟。

写在之前

我们在昨天的文章中()所写的函数,它们的参数的个数都是确定的,我们知道世界是不确定的,那么函数的参数当然也有不固定的时候,那么当我们碰到这个问题的时候,该怎么解决呢?请看接下来的文章。

*args

如果你之前学过 C 或者 C++,看到星号的第一反应可能会认为这个与指针相关,然后就开始方了,其实放宽心,Python 中是没有指针这个概念的。

在 Python 中我们使用星号收集位置参数,请看下面的例子:

>>> def fun(x,*args):...    print(x)...    res = x...    print(args)...    for i in args:...            res += i...    return res... >>> print(fun(1,2,3,4,5,6))复制代码

上述例子中,函数的参数有两个,但是我们在输出的时候赋给函数的参数个数不仅仅是两个,让我们来运行这个代码,得到如下的结果:

1(2, 3, 4, 5, 6)21复制代码

从上面我们可以看出,参数 x 得到的值是 1,参数 args 得到的是一个元组 (2,3,4,5,6) ,由此我们可以得出,如果输入的参数个数不确定,其它的参数全部通过 *args 以元组的方式由 arg 收集起来。

为了更能明显的看出 *args,我们下面用一个简单的函数来表示:

>>> def print_args(*args):...    print(args)...复制代码

接下来我传入不同的值,通过参数 *args 得到的结果我们来看一下:

>>> print_args(1,2,3)(1, 2, 3)>>> print_args('abc','def','ghi')('abc', 'def', 'ghi')>>> print_args('abc',['a','b','c'],1,2,3)('abc', ['a', 'b', 'c'], 1, 2, 3)复制代码

不管是什么,都可以一股脑的塞进元组里,即使只有一个值,也是用元组收集,所以还记得在元组里一个元素的时候的形式吗?元组中如果只有一个元素,该元素的后面要有一个逗号。

那么如果不给 *args 传值呢?

>>> def print_args(*args):...    print(args)... >>> print_args()()复制代码

答案就是这时候 *args 收集到的是一个空的元组。

最后提醒一点的是,当使用星号的时候,不一定要把元组参数命名为 args,但这个是 Python 中的一个常见做法。

**kwargs

使用两个星号是收集关键字参数,可以将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:

>>> def print_kwargs(**kwargs):...    print(kwargs)... >>> print_kwargs(a = 'lee',b = 'sir',c = 'man'){
'a': 'lee', 'b': 'sir', 'c': 'man'}复制代码

由例子可以看出,在函数内部,kwargs 是一个字典。

看到这的时候,可能聪明的你会想,参数不是具有不确定型吗?如何知道参数到底会用什么样的方式传值?其实这个很好办,把 *args 和 **kwargs 综合起来就好了啊,请看下面的操作:

>>> def print_all(x,y,*args,**kwargs):...    print(x)...    print(y)...    print(args)...    print(kwargs)... >>> print_all('lee',1234)lee1234(){}>>> print_all('lee',1,2,3,4,5)lee1(2, 3, 4, 5){}>>> print_all('lee',1,2,3,4,5,like = 'python')lee1(2, 3, 4, 5){
'like': 'python'}复制代码

如此这般,我们就可以应对各种各样奇葩无聊的参数请求了。当然在这还是要说的是,这里的关键字参数命名不一定要是 kwargs,但这个是通常做法。

写在最后

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。

转载地址:http://krcpx.baihongyu.com/

你可能感兴趣的文章
CYQ.Data 轻量数据层之路 bug反馈、优化建议、最新框架下载
查看>>
如何用移动应用评估来提高企业安全性?
查看>>
个人信息为何到处“裸奔”?
查看>>
轻奢羽绒服品牌 Moncler使用NFC技术,向假货宣战
查看>>
新品、新投资方两大悬念待解 海云捷迅发布会受关注
查看>>
智慧城市建设得如何 芜湖召开宣传贯彻工作会议
查看>>
Verizon移动车辆内测5G网络 网速达家庭宽带120倍
查看>>
【转】hadoop/hbase搭建
查看>>
DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)
查看>>
微软Windows 10商店不再接受比特币
查看>>
2016大数据产业峰会正式启动
查看>>
全面剖析synchronized
查看>>
JIRA的安装部署问题
查看>>
“学华为”造芯片,小米离“中国芯”有多远?
查看>>
SA:全球移动视频市场规模将在2021年达250亿美元
查看>>
美国司法部部长:政府才是那台iPhone的真主人
查看>>
代表委员聚焦网络安全:信息立法迫在眉睫
查看>>
你误解“智能家居”了吗
查看>>
安立公司推出CPRI RF 测量选件
查看>>
公共安全视频监控的5个创新技术大预测
查看>>