Python 参数之 *args 和 **kwargs
先上一段代码:
#-*-coding:utf-8-*-
def fun(id, *args, **kwargs):
print "id = ", id
print "args = ", args
print "kwargs = ", kwargs
print "---------------------------------"
if __name__ == '__main__':
fun(1,2,3,4)
fun(1, a=1,b=2,c=3)
fun('a','b','c', a=1,b=2,c=3)
a = (1,2,3,4)
b = {'a':1,'b':2,'c':3}
fun(*a, **b)
输出结果
id = 1
args = (2, 3, 4)
kwargs = {}
---------------------------------
id = 1
args = ()
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------
id = a
args = ('b', 'c')
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------
id = 1
args = (2, 3, 4)
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------
可见*args
是一个元组,而**kwargs
是一个字典,同时,根据Python的要求,**kwargs
必须放在*args
后面。
这一特性非常适合编写含有大量参数的程序,比如使用字典,在程序中可以先判断该值是否存在,然后进行下一步的操作。判断字典值是否存在可以使用dict.has_key('key')
进行判断。
**kwargs
还有下面的更常用的用法,参考下Matplotlib
里面的一个常用法。
x = kwargs.pop('x', 0.5)
y = kwargs.pop('y', 0.98)
if ('horizontalalignment' not in kwargs) and ('ha' not in kwargs):
kwargs['horizontalalignment'] = 'center'
首先,可以使用pop
函数,pop
函数用于删除dict
中的一个值,并返回这个值,在上面的例子中,如果kwargs
中没有x
,则返回0.5。
另外,也可以使用if 'fontsize' not in kwargs
判断key
是否存在。