python中 *args和**kwargs 绝对是特殊的存在,刚学python的时候,小卡对它也是印象深刻,复杂不说,还让人摸不着头脑。更别说它的应用场景了,压根不知道它到底有何用处?哪里有用处?我想很多朋友也是有一定疑惑,这俩玩意儿到底咋用呢?别急,今天我就来介绍 三个 应用场景,这三个应用场景基本囊括了 80% 的使用需求了。
一、*args和**kwargs具体是干什么的?在讲应用场景前,还是按照惯例要说一说这俩货的用途。
• *args:代表了一切没有参数名的参数
• **kwargs:代表了一切有参数名的参数
• *args和**kwargs:合并起来代表一切参数
好家伙,越解释越糊涂,那就赶紧上代码,来一探究竟吧!
*args
现在我们来看一个函数:
学过函数的基本都明白,将 1 传给了 a,在 test() 函数里就可以拿到这个 1。
那现在我想再传个 2、3、4 进去呢?
很多小伙伴看到这写法肯定着急了,数量不对数量不对啊!
你这传 四个数字 进去,函数起码也得 四个参数 去接收啊,你看连 PyCharm 都在下面贴心地为我进行了提示,告诉我错了。
怎么办?其实有两种做法:
- 1. 传多少个,函数加多少个参数名
- 2. 使用 *args
第一种方法 倒是可行,但万一未来我不停传新的数字进去可咋办呢?所以我们用 第二种方法 最为妥当。
使用*args
像下面这样写,我们就可以想传多少数字就能传多少数字进去,取出 args 我们发现,它里面是一个元祖,获取方式也是用元祖的方式获取。
我们可以看到,我们传入参数的都是 1、2、3、4,没有用到 xxx=1, xxx=2, xxx=3, xxx=4 带参数名的方式,如果想要获取带参数名的那就需要 **kwargs 登场了!
**kwargs
有了之前 *args 的例子,我们直接来看动态加入带参数名的示例代码:
可以看到我们用了参数名传入,并且利用 **kwargs 来获取时,kwargs 它是用字典来承载的,拿取的方式以字典取值方式即可。
*args和**kwargs表示万物
既然知道了 *args 代表没参数名,**kwargs代表有参数名,这俩哥们凑一块就是代表了万物:任意参数。
废话不多说,直接上代码:
这两个兄弟一上场,参数想咋传咋传,任何参数传进去都不会报错,这就是他俩的本事。
二、三个应用场景
既然知道了用途,你能想象到它俩的应用场景吗?是真的去获取相应的传入参数的值吗?
no!no!no!小卡开发这么多年,基本上也很少碰到要去函数里将这两个家伙保存的值给取出来的场景。
所以使用它俩基本上不是为了取值,下面三个场景才是真正的 大杀招!
第一招:__init__
以后我们写一个类里面的 __init__ 方法记住以下面的方式:
*args和**kwargs 在 __init__ 方法中一站岗,只要是面向对象的开发方式,就 永远不会报错。
你自拟的参数将如下设计:
在 *args和**kwargs 哥俩之前,你的参数随意设计,他俩为你保驾护航。
第二招:装饰器
以后碰到装饰器,内部的方法 wrapper() 部分的参数就安心交给 *args和**kwargs 这哥俩,你的装饰器就准没错。
想象一下,现在你是在一个团队里,你需要写一个函数给 小王 用,但 小王 和你不对付,他喜欢的女神成了你的女朋友,因此一直想给你使拌。
现在你要给他写一个调用函数,他心想终于有机会了,准备给你随便传 100个参数,让你的函数报错好让你出丑。
机智如你,早早就想好了应对之策,在给 小王的函数中添加了 *args和**kwargs 俩兄弟。
虽然 小王 用你的函数传了 100个参数,但竟然没有报错,你保住了名声!
三、总结
怎么样,知道 *args和**kwargs 有哪三个应用场景了吗?我再来罗列一下:
1. __init__ 方法
2. 装饰器
3. 给其他人使用的函数或方法
除了这以上三个场景,基本上不需要主动去获取 *args和**kwargs 里面的值,你记住了吗?
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/13103/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料