作為一個沒有系統學習過python,卻要與之日日相對看源碼的人,真尼瑪痛苦啊。。。經常看到**kws之類的,心中狂虐:這啥?指標的指標?!T^T
昨天看《Python核心編程》的時候,剛好看到了函數部分,於是順勢將目前接觸到的集中參數類型都總結一下吧^^
總的來說,除去普通的normal args,python中比較特別的函數參數有:關鍵字參數、預設參數、非關鍵字可變長參數(元組)、關鍵字可變長參數(字典),下面將結合例子進行介紹。
關鍵字參數:調用時指定參數的名稱,且與函式宣告時的參數名稱一致。使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,僅根據參數的指定進行賦值。例:
# 函數定義def foo(x, y): print 'x is %s' % x print 'y is %s' % yif __name__ == '__main__': # 標準調用 foo(1, 2) # 關鍵字調用 foo(y = 1, x = 2)
在標準調用中,x和y依次為1和2;在關鍵字調用中,x和y的值根據名字指定而與順序無關。
# 標準調用輸出x is 1y is 2# 關鍵字調用輸出x is 2y is 1
預設參數:在函式宣告時,指定形參的預設值,調用時可不傳入改參數(使用預設值)。例:
def tax(cost, rate = 0.17): print cost * (1 + rate) if __name__ == '__main__': # rate使用預設值0.17 tax(1000) # rate指定為0.05 tax(1000, 0.05)
使用預設值時,rate為0.17,結果為1170;在指定參數rate時,rate為0.05,結果為1050。
# tax(1000)的輸出1170.0# tax(1000, 0.05)的輸出1050.0
非關鍵字可變長參數(元組):“非關鍵字”“可變長”顧名思義是允許在調用時傳入多個“非關鍵字”參數,python會將這些多出來的參數放入一個元組中。例:
# 定義函數,其中*theRest為非關鍵字可變長參數def tupleVarArgs(arg1, arg2='defaultB', *theRest): print 'formal arg 1: ', arg1 print 'formal arg 2: ', arg2 for eachXtrArg in theRest: print 'another arg: ', eachXtrArg
我們採用多種調用方式來查看結果,從而理解非關鍵字可變長參數的使用:
>>> tupleVarArgs('abc')formal arg 1: abcformal arg 2: defaultB
>>> tupleVarArgs('abc', 'def')formal arg 1: abcformal arg 2: def
>>> tupleVarArgs('abc', 'def', 'xyz', 123.4)formal arg 1: abcformal arg 2: defanother arg: xyzanother arg: 123.4
關鍵字可變長參數(字典):“關鍵字”“可變長”顧名思義是允許在調用時傳入多個“關鍵字”參數,python會將這些多出來的<參數名, 參數值>放入一個字典中。需要注意的是,關鍵字變數參數應該為函數定義的最後一個參數,帶**。例:
# 定義函數,其中**theRest為關鍵字可變長參數def dictVarArgs(arg1, arg2='defaultB', **theRest): print 'formal arg 1: ', arg1 print 'formal arg 2: ', arg2 for eachXtrArg in theRest.keys(): print 'Xtra arg %s: %s' % (eachXtrArg, str(theRest[eachXtrArg]))
我們採用多種調用方式來查看結果,從而理解關鍵字可變長參數的使用:
>>> dictVarArgs('abc')formal arg 1: abcformal arg 2: defaultB>>> dictVarArgs('abc', 'def')formal arg 1: abcformal arg 2: def# a=1和b='aha'即為關鍵字可變參數,他們會被放入theRest字典>>> dictVarArgs('abc', 'def', a=1, b='aha')formal arg 1: abcformal arg 2: defXtra arg a: 1Xtra arg b: aha# 全部採用關鍵字參數,但只有a和b是可變的,會被放入theRest>>> dictVarArgs(arg2='def', a=1, b='aha', arg1='put at the last')formal arg 1: put at the lastformal arg 2: defXtra arg a: 1Xtra arg b: aha# 這次使用了arg2的預設值>>> dictVarArgs('one', a=1, b='aha', name=('yuki', 'lau'))formal arg 1: oneformal arg 2: defaultBXtra arg a: 1Xtra arg b: ahaXtra arg name: ('yuki', 'lau')
注意
當非關鍵字可變長參數和關鍵字可變長參數出現在同一個函數中時,他們應當遵守如下的順序約定:
def newfoo(normal_arg1, normal_arg2, *non-keywords, ** keywords): pass
當然,你也可以直接向函數中傳入元組和字典對象,如:
>>> newfoo(2, 4, *(6, 8), **{'foo': 10, 'bar': 12})
也可以來個“混搭”,孤立的可變長參數將會被放入對應的tuple或dict中,如:
>>> newfoo(2, 4, 3, x=4, y=5, *aTuple, **aDict)
在這個例子中,參數3會被放入aTuple,參數x=4和y=5會被放入aDict
當然關於Python函數的參數問題還有很多,本文僅僅介紹幾種常用的情況,僅做個簡單的瞭解和參考。