谈Python函数的参数处理


以下几种函数定义
def funcion(a,b):
    print a,b

function(1,2)

def function1(*a):
    print a      <=打印元组

function1(1,2,3)

def function2(**a):
    print a      <=打印字典

function2(name='zzj',age=30)

def function3(*a,**b):
    print a,b    <=打印元组+字典

function3(1,2,3,name='zzj',age=30)

调用,需要人为的构造实参.如果我们有现成的元组和字典,想作为实参应该怎么办?

如我们经过一系列的动作得知了一个元组aTuple,想将其作为实参,

难道function1(aTuple)?
返回是一个((aTuple),)将其aTuple作为一个元组元素,不是我们想要的,我们想要的是将aTuple元组元素作为*a的元素,所以,我们这里需要调用apply函数来处理这样的事情
apply(function1,aTuple)

code
>>> aTuple=(1,2,3,4)
>>> function1(aTuple)
((1, 2, 3),)
>>> apply(function1,aTuple)
(1, 2, 3, 4)

同样的道理我们的实参是一个字典aDict呢?如果以function2(aDict),呵呵,不能以aDict作为实参,那么可以用apply来实现吗?可以,请看如下code演示,所以后期如果你的参数是以元组或者字典组成或者参数,元组,字典三者混合,那么不需要考略如何将其转换成原始调用模式,可以考略下使用apply功能来完成.

code
>>> aDict
{'age': 30, 'name': 'zzj'}
>>> function2(name='zzj',age=30)
{'age': 30, 'name': 'zzj'}
>>> function2(aDict)           
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function2() takes exactly 0 arguments (1 given)

>>> apply(function2,(),aDict)
{'age': 30, 'name': 'zzj'}

最后展示下用apply函数来处理参数,元组,字典三者混合的案例

code
>>> def function4(a,b,c,*d,**e):
...    print a,b,c,d,e
...
>>> arg1=1
>>> arg2=2
>>> arg3=3
>>> aTuple=(4,5,6)
>>> aDict={'name':'zzj','age':30}
>>> apply(function4,(arg1,arg2,arg3,aTuple),aDict)
1 2 3 ((4, 5, 6),) {'age': 30, 'name': 'zzj'}
>>>
注意,实参与形参的顺序,一定要对应上,否则就不是你想要的值了.

通过以上实例相信大家对python中函数定义的参数有一定的玩法了(包括可变参数的概念*a,**b),并且提供apply函数来实现更加灵活的调用.

相关内容