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),使用拼接操作符传递参数,可以不用考虑参数的数量.

原文地址:https://www.cnblogs.com/nomorewzx/p/4191242.html