Python 中函数的 收集参数 机制
时间:2011-03-31 来源:oyzway
编写函数,很多情况下我们都会传递一系列值作为参数。为了让用户更加方便地给函数提供任意多的值作为参数, Python 中实现了一个 收集参数 的机制:在参数名前面加星号 ( * )。即: def cParam( *params ): pass 。来几行代码看看具体情况:
1 >>> def cParam( *params ):
2 print params
3
4 >>> cParam(1)
5 (1,)
6 >>> cParam(1, 2)
7 (1, 2)
8 >>> cParam()
9 ()
10 >>>
我们看到,定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数。返回结果是一个元组。
传递零个参数时函数并不报错,而是返回一个空元组。
但以上这种方法也有局限性,它不能收集关键字参数,即:
>>> cParam(1,2,3, h=4)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
cParam(1,2,3, h=4)
TypeError: cParam() got an unexpected keyword argument 'h'
>>>
我们看到,它返回了一个 TypeError 。这时,对关键字参数进行收集的另一种 收集参数 机制闪亮登场。使用两个星号 ( ** ) ,用法同上。
1 >>> def ccParam( **params ):
2 print params
3
4 >>> ccParam( a=1, b=2, c=3 )
5 {'a': 1, 'c': 3, 'b': 2}
6 >>> ccParam()
7 {}
8 >>>
最后返回一个以参数名为键、参数值为键值的字典。
* 和 ** 是可以一起使用的,返回特定的结果。
1 >>> cccParam(1,2,3, a=4,b=5)
2 (1, 2, 3)
3 {'a': 4, 'b': 5}
4 >>> def cccParam_2(x,y,z=3, *params1, **params2):
5 print x,y,z
6 print params1
7 print params2
8
9
10 >>> cccParam_2(1,2,3,a=4,b=5)
11 1 2 3
12 ()
13 {'a': 4, 'b': 5}
14 >>>
参数收集的用处之一是使我们编写函数时不用头疼将 N 多个参数都塞在一个括号里,既美观又省事。用处之二便是:
* :可以将一系列值存放进一个元组变量里,可用该元组变量名加一个 * 号作为参数传递给一个正被调用的函数,而后该函数就可以自由地对这些值进行一系列合法的操作。
** :同理,只不过变量存放的方式是字典。
1 >>> def add(x, y):
2 return x + y
3
4 >>> param = (1, 2)
5 >>> add( *param )
6 3
7 >>>
8 >>>
9 >>> def useDict( **kwds ):
10 print kwds["name"], " is ", kwds["age"], " years old."
11
12 >>> args = {"name": "oyzway", "age": 23}
13 >>> useDict( **args )
14 oyzway is 23 years old.
15 >>>
完。
相关阅读 更多 +