Python 收集参数与反转过程
收集 参数
简单的说,采用如下定义的函数
def my_func(*param1, **param2):
print *param1
print **param2
就是Python中的收集参数.即,所有位置参数会以元组的形式传递给函数my_func()的形式参数param,而位置参数之后的关键字参数会组成字典形式传递给函数my_func()的形式参数param2.
示例如下:
>>>my_func(1,2,3,foo='fooword',bar='barword') (1, 2, 3) {'foo': 'fooword', 'bar': 'barword'}
如果只向函数传递位置参数或者只传递关键字参数,也是可以的. 如下:
>>> my_func(bar='barword',foo='fooword')
() {'foo': 'fooword', 'bar': 'barword'} >>> my_func(1,2,3) (1, 2, 3) {}
如果在关键字参数后,再添加位置参数,该位置参数将不会被收集,如下:
>>> my_func(1,2,foo='fooword',bar='barword') (1, 2) {'foo': 'fooword', 'bar': 'barword'}
如果试图在位置参数前传递关键字参数,程序将抛出异常,如下:
>>> my_func(first='firstword',1,2,foo='fooword',bar='barword') File "<stdin>", line 1 SyntaxError: non-keyword arg after keyword arg
反转过程
既然,在定义函数时可以指定将参数收集为元组或字典,那么,在调用函数时,当然可以将实际参数存储于元组或字典中,传递给函数,这就称为反转过程.
没有使用参数收集的函数
如果一个函数正常定义,使用反转过程传递参数,示例如下:
>>> def add(x,y): ... return x+y ... >>> t = (3,4) >>> m= add(*t) >>> print m 7 >>>m= add(t) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() takes exactly 2 arguments (1 given)
使用参数收集函数
如果一个函数使用参数收集,使用反转过程传递参数,示例如下:
>>> d = {'foo':'fooword','bar':'barword'} >>> my_func(*t,**d) (3, 4) {'foo': 'fooword', 'bar': 'barword'}
注意: 反转过程,将参数整合为一个元组或字典传递给函数,同样需要使用 *t (元组)或者 **d (字典) 的调用形式.
收集参数的应用
以位置参数为例,使用收集参数方法,可以一次传递多个参数.
>>> def input_name(*name): ... for n in name: ... print "input is %s" % n ... >>> input_name('John') input is John >>> input_name('John','Hank','Alice','Bob') input is John input is Hank input is Alice input is Bob
收集参数,如果使用关键字参数,即收集到一个字典,使用方法类似于元组.
收集参数中的 * 符号,被成为 "拼接操作符" (Splicing),使用拼接操作符传递参数,可以不用考虑参数的数量.