作為一個沒有系統學習過python,卻要與之日日相對看源碼的人,真尼瑪痛苦啊。。。經常看到**kws之類的,心中狂虐:這啥?指針的指針?!T^T
昨天看《Python核心編程》的時候,剛好看到了函數部分,於是順勢將目前接觸到的集中參數類型都總結一下吧^^
總的來說,除去普通的normal args,python中比較特別的函數參數有:關鍵字參數、默認參數、非關鍵字可變長參數(元組)、關鍵字可變長參數(字典),下面將結合例子進行介紹。
關鍵字參數:調用時指定參數的名稱,且與函數聲明時的參數名稱一致。使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,僅根據參數的指定進行賦值。例:
# 函數定義 def foo(x, y): print 'x is %s' % x print 'y is %s' % y if __name__ == '__main__': # 標准調用 foo(1, 2) # 關鍵字調用 foo(y = 1, x = 2)
在標准調用中,x和y依次為1和2;在關鍵字調用中,x和y的值根據名字指定而與順序無關。
# 標准調用輸出 x is 1 y is 2 # 關鍵字調用輸出 x is 2 y 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: abc formal arg 2: defaultB
>>> tupleVarArgs('abc', 'def') formal arg 1: abc formal arg 2: def
>>> tupleVarArgs('abc', 'def', 'xyz', 123.4) formal arg 1: abc formal arg 2: def another arg: xyz another 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: abc formal arg 2: defaultB >>> dictVarArgs('abc', 'def') formal arg 1: abc formal arg 2: def # a=1和b='aha'即為關鍵字可變參數,他們會被放入theRest字典 >>> dictVarArgs('abc', 'def', a=1, b='aha') formal arg 1: abc formal arg 2: def Xtra arg a: 1 Xtra arg b: aha # 全部采用關鍵字參數,但只有a和b是可變的,會被放入theRest >>> dictVarArgs(arg2='def', a=1, b='aha', arg1='put at the last') formal arg 1: put at the last formal arg 2: def Xtra arg a: 1 Xtra arg b: aha # 這次使用了arg2的默認值 >>> dictVarArgs('one', a=1, b='aha', name=('yuki', 'lau')) formal arg 1: one formal arg 2: defaultB Xtra arg a: 1 Xtra arg b: aha Xtra 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函數的參數問題還有很多,本文僅僅介紹幾種常用的情況,僅做個簡單的了解和參考。