2012年8月7日 星期二

python函數的可變參數的prototype




#函數的prototype(加上* 和 ** 符號)

def functionName(para,*tup_para,**dic_para):
    print para
    for each in tup_para:
        print each
    for k,v in dic_para.items():
        print k,v

##使用時須加上*和**符號解析之

>>> functionName('stayhigh',*(1,2,3),**{'k1':'v1','k2':'v2'})
stayhigh
1
2
3
k2 v2
k1 v1
##若不使用*和**符號
則將tup_para與dic_para當成tuple的元素並解析之

>>>functionName('stayhigh',(1,2,3),{'k1':'v1','k2':'v2'})
#此時(1,2,3),{'k1':'v1','k2':'v2'}皆為tup_para的元素

stayhigh
(1, 2, 3)
{'k2': 'v2', 'k1': 'v1'}



#若要使用參數默認值,則函數原形為(不須加上*和 **符號)


def functionName(para='dname',tup_para=(1,2),dic_para={'k1':'v1'}):
    print para
    for each in tup_para:
        print each
    for k,v in dic_para.items():
        print k,v


>>> functionName()
dname
1
2
k1 v1

>>> functionName('stayhigh',(3,4),{'mykey':'myvalue'})
stayhigh
3
4
mykey myvalue


#最常見的使用方式
def fstandard(arg='stayhigh',*args,**kwargs):

print 'arg:',arg
print 'args:',args
print 'kwargs:',kwargs




>>> fstandard(1,2,3,mykey1='myvalue1',mykey2='myvalue2')
arg: 1
args: (2, 3)
kwargs: {'mykey2': 'myvalue2', 'mykey1': 'myvalue1'}


使用apply函數的優點:
參考至:http://www.cnpythoner.com/post/90.html
。做pys60时UI构造比较麻烦,有apply的话,用一个列表来构造整个程序的数个界面就不是问题了。主要还是参数的给出非常灵活,可以把已有的一个列表或者字典直接丢过去。


#python 2.5以上版本,對於apply函數的建議

apply(object[, args[, kwargs]]) -> value

Call a callable object with positional arguments taken from the tuple args,
and keyword arguments taken from the optional dictionary kwargs.
Note that classes are callable, as are instances with a __call__() method.

Deprecated since release 2.3. Instead, use the extended call syntax:
    function(*args, **keywords).


#使用kwargs需要注意的小細節

>>> def dfunc(**kwargs):
for k,v in kwargs.items():
print k,'->',v

#使用a=1,b=2的參數形式傳遞
>>> dfunc(a=1,b=2) 
a -> 1
b -> 2
#使用**{'a':1,'b':2}的參數形式傳遞
>>> dfunc(**{'a':1,'b':2})
a -> 1
b -> 2

沒有留言:

張貼留言