您的位置:首页 > 编程语言 > Python开发

Python 中函数的 收集参数 机制

2011-03-31 23:38 288 查看
编写函数,很多情况下我们都会传递一系列值作为参数。为了让用户更加方便地给函数提供任意多的值作为参数, Python 中实现了一个 收集参数 的机制:在参数名前面加星号 ( * )。即: def cParam( *params ): pass 。来几行代码看看具体情况:

>>> def cParam( *params ):
print params

>>> cParam(1)
(1,)
>>> cParam(1, 2)
(1, 2)
>>> cParam()
()
>>>


我们看到,定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数。返回结果是一个元组。

传递零个参数时函数并不报错,而是返回一个空元组。

但以上这种方法也有局限性,它不能收集关键字参数,即:

>>> 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 。这时,对关键字参数进行收集的另一种 收集参数 机制闪亮登场。使用两个星号 ( ** ) ,用法同上。

>>> def ccParam( **params ):
print params

>>> ccParam( a=1, b=2, c=3 )
{'a': 1, 'c': 3, 'b': 2}
>>> ccParam()
{}
>>>


最后返回一个以参数名为键、参数值为键值的字典。

* 和 ** 是可以一起使用的,返回特定的结果。

>>> cccParam(1,2,3, a=4,b=5)
(1, 2, 3)
{'a': 4, 'b': 5}
>>> def cccParam_2(x,y,z=3, *params1, **params2):
print x,y,z
print params1
print params2

>>> cccParam_2(1,2,3,a=4,b=5)
1 2 3
()
{'a': 4, 'b': 5}
>>>


参数收集的用处之一是使我们编写函数时不用头疼将 N 多个参数都塞在一个括号里,既美观又省事。用处之二便是:

* :可以将一系列值存放进一个元组变量里,可用该元组变量名加一个 * 号作为参数传递给一个正被调用的函数,而后该函数就可以自由地对这些值进行一系列合法的操作。

** :同理,只不过变量存放的方式是字典。

>>> def add(x, y):
return x + y

>>> param = (1, 2)
>>> add( *param )
3
>>>
>>>
>>> def useDict( **kwds ):
print kwds["name"], " is ", kwds["age"], " years old."

>>> args = {"name": "oyzway", "age": 23}
>>> useDict( **args )
oyzway  is  23  years old.
>>>


完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: