IOTXING

记录技术学习之路

0%

Python *args与**kwargs比较

通过在函数传参的时候,如果不确定要传入的参数,我们可以使用*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