通过在函数传参的时候,如果不确定要传入的参数,我们可以使用*args或者**kwargs来当做参数,但是这两个之间又存在着一些不同,我们主要是通过几个例子来进行区分 先看看类型
In [22]: def showArgs(*args):
...: print type(args)
In [23]: showArgs()
<type 'tuple'>
In [24]: def showKwargs(**kwargs):
...: print type(kwargs)
...:
In [26]: showKwargs()
<type 'dict'>
我们从类型上面可以看出来,args默认是tuple类型 tuple是一种类似于List的数据结构,但是在tuple生成之后是不能够更改的 而kwargs是dict类型,这个应该就比较熟悉了 看到这两个的类型之后,我们就可以推理出它们在应用场景上面的不同了,我们再通过例子来进行区分一下
In [27]: def showArgs(*args):
...: print args
...:
In [28]: showArgs(1,2,3,4,5,6)
(1, 2, 3, 4, 5, 6)
这里我们无论传入什么值进去,最终的结果都是一个tuple。而我们传入的给args传入的值相当于这个tuple的初始值, 举个不恰当的例子,类似于
args = tuple(i for i in *args)
我们再看看**kwargs
In [30]: def showKwargs(**kwargs):
...: print kwargs
...:
In [31]: showKwargs(a=1,b=2,c=3,d=4)
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
我们最终获得到的kwargs是一个利用传入参数生成的dict 下面是我从stackoverflow上面找到的一个应用场景
>>> def print_everything(*args):
for count, thing in enumerate(args):
... print( '{0}. {1}'.format(count, thing))
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage
>>> def table_things(**kwargs):
... for name, value in kwargs.items():
... print( '{0} = {1}'.format(name, value))
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit