简明Python 可变参数
1 def total(a=5, *numbers, **phonebook): 2 print('a', a) 3 #遍历元组中的所有项目 4 for single_item in numbers: 5 print('single_item', single_item) 6 #遍历字典中的所有项目 7 for first_part, second_part in phonebook.items(): 8 print(first_part,second_part) 9 print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
1 a 10 2 single_item 1 3 single_item 2 4 single_item 3 5 Inge 1560 6 John 2231 7 Jack 1123 8 None
当我们声明一个诸如 *param 的星号参数时,从此处开始直到结束的所有位置参数 (Positional Arguments)都将被收集并汇集成一个称为“param”的元组(Tuple)。 类似地,当我们声明一个诸如 **param 的双星号参数时,从此处开始直至结束的所有关键字 参数都将被收集并汇集成一个名为 param 的字典(Dictionary)。
*args
1 def argsFunc(a, *args): 2 print a 3 print args 4 5 >>> argsFunc(1, 2, 3, 4) 6 1 7 (2, 3, 4)
argsFunc
中匹配完定义好的参数,剩余的参数以元组的形式存储在 args(args 名称你可以自行定义),因此在上述程序中只要你传入不小于 1 个参数,该函数都会接受,当然你也可以直接定义只接受可变参数,你就可以自由传递你的参数:
1 def argsFunc(*my_args): 2 print my_args 3 4 >>> argsFunc(1, 2, 3, 4) 5 (1, 2, 3, 4) 6 >>> argsFunc() 7 ()
很简单把,现在来将另一个种不定参数形式
**kwargs
形参名前加两个*表示,参数在函数内部将被存放在以形式名为标识符的 dictionary
中,这时调用函数的方法则需要采用 arg1=value1,arg2=value2
这样的形式。
为了区分,我把 *args 称作为数组参数,**kwargs 称作为字典参数
>>> def a(**x):print x
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中
不过,有个需要注意,采用 **kwargs 传递参数的时候,你不能传递数组参数
>>> a(1,2,3) #这种调用则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)