Python 可变长度函数参数
func( *tuple_grp_nonkw_args, **dict_grp_kw_args )
在编程的过程中,我们可能会遇到函数参数个数不固定的情况。这时就需要使用可变长度的函数参数来实现我们的功能。在Python中,有两种变长参数,分别是元组(非关键字参数)和字典(关键字参数).
1. 元组可变长参数
当函数调用中包括一个元组变长参数*tuple_grp_nonkw_args时,除去前面固定位置参数和关键字参数的其余参数将按顺序插入一个元组进行访问.
def fun_test(positional_arg,keyword_arg="default",*tuple_arg): print "positional arg: ", positional_arg print "key word arg: ", keyword_arg for each_additional_arg in tuple_arg: print "additional_arg: ",each_additional_arg fun_test(1) positional arg: 1 key word arg: default fun_test(1,2) positional arg: 1 key word arg: 2 fun_test(1,2,3) positional arg: 1 key word arg: 2 additional_arg: 3 fun_test(1,2,3,"a") positional arg: 1 key word arg: 2 additional_arg: 3 additional_arg: a
2.字典可变长参数
字典变长参数中,额外的关键字参数被放入了一个字典进行使用。字典中,键为参数名,值为相应的参数值。其表示方式是放在函数参数最后的**开头的参数,如**dict_grp_kw_args.
def fun_test2(positional_arg,keyword_arg="default",**dict_arg): print "positional arg: ", positional_arg print "key word arg: ", keyword_arg for k,v in dict_arg.iteritems(): print "dict arg: %s = %s" %(k,v) fun_test2(1) positional arg: 1 key word arg: default fun_test2(1,2) positional arg: 1 key word arg: 2 fun_test2(1,2,x1=3) positional arg: 1 key word arg: 2 dict arg: x1 = 3 fun_test2(1,2,x1=3,x2="test") positional arg: 1 key word arg: 2 dict arg: x2 = test dict arg: x1 = 3
#c在这里是一个tuple,我们在调用funcD的时候,至少要传递2个参数,2个以上的参数,都放到c里了,如果只有两个参数,那么c就是一个empty tuple
def funcD(a, b, *c): print a print b print "length of c is: %d " % len(c) print c funcD(1,2,3,4,5,6,7) 1 2 length of c is: 5 (3, 4, 5, 6, 7)
#b是一个dict对象实例,它接受了关键字参数b,c,d
def funcF(a, **b): print a for x in b: print x + ": " + str(b[x]) funcF(100,b=1,c="a",d=3) 100 c: a b: 1 d: 3
tupe_args=(3,4,"five")
dict_args={"x1":1,"x2":"test"}
fun_test(1,2,*tupe_args)
positional arg: 1
key word arg: 2
additional_arg: 3
additional_arg: 4
additional_arg: five
fun_test2(1,2,**dict_args)
positional arg: 1
key word arg: 2
dict arg: x2 = test
dict arg: x1 = 1
3.注意
函数调用的完整表达形式为:func( positional_args, keyword_args, *tuple_grp_nonkw_args, **dict_grp_kw_args )
在使用的过程中,所有参数都是可选的,但应当注意的是:上面四种参数的位置是不可调换的!