Python函數參數總結


作為一個沒有系統學習過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函數的參數問題還有很多,本文僅僅介紹幾種常用的情況,僅做個簡單的了解和參考。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM