Python的*args和**kwargs

我记得 刚开始看到args和kwargs这个单词我是懵逼的 加上**这些东西就更找不到东西南北中了。其实呢,仔细理解发现很简单首先看英文
1.args=arguments也就是我们函数中需要的参数,再接着看英文s是复数,那么这个就是大于一个喽,在python可以有多个值的数据类型有三个 dict list和tuple 那这里就是tuple
2.kwargs 基于args我们知道 这里args还是1里的意思, 但是kw代表的就是 key 和value ,有kw的数据类型python里就只有dict,所以我们就明了了。 不难
3.另外 args和kwargs是个名字,统一的说法, 其实这个输入限定是dict还是tuple看的是*或** 他们决定这个性质

#python *和**区别
#一个星(*):表示接收的参数作为元组来处理
#两个星(**):表示接收的参数作为字典来处理

#***元组***
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
'''

def mix(*args,**kwargs):
print 'args=',args
print 'kwargs=',kwargs
print '------'
test1:
>>> mix(1,2,3,4)
args= (1, 2, 3, 4)
kwargs= {}
------
test2:
mix(a=1,b=3)
args= ()
kwargs= {'a': 1, 'b': 3}
------
test3:
mix(1,'a',None,a=1,b='2',c=3)
args= (1, 'a', None)
kwargs= {'a': 1, 'c': 3, 'b': '2'}
------
test4:
mix(1,2,4,a=1,b=4)
args= (1, 2, 4)
kwargs= {'a': 1, 'b': 4}

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前