首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 拓展之×args&×kwargs

写在之前

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

*args

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

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

>>>deffun(x,*args):

...print(x)

...res = x

...print(args)

...foriinargs:

...res += i

...returnres

...

>>>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,我们下面用一个简单的函数来表示:

>>>defprint_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 传值呢?

>>>defprint_args(*args):

...print(args)

...

>>>print_args()

()

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

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

**kwargs

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

>>>defprint_kwargs(**kwargs):

...print(kwargs)

...

>>>print_kwargs(a ='lee',b ='sir',c ='man')

{'a':'lee','b':'sir','c':'man'}

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

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

>>>defprint_all(x,y,*args,**kwargs):

...print(x)

...print(y)

...print(args)

...print(kwargs)

...

>>>print_all('lee',1234)

lee

1234

()

{}

>>>print_all('lee',1,2,3,4,5)

lee

1

(2,3,4,5)

{}

>>>print_all('lee',1,2,3,4,5,like ='python')

lee

1

(2,3,4,5)

{'like':'python'}

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

写在最后

至此我们函数的基本内容大概齐已经介绍的差不多了,如果以后还碰到什么没写过的我后续会再补充,这不意味着结束,后面还有更需要深入的东西要讲,尽情期待。

The end。

好期待你的加入

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803A09K8G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券