作為乙個沒有系統學習過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), **)
也可以來個「混搭」,孤立的可變長引數將會被放入對應的tuple或dict中,如:
>>> newfoo(2, 4, 3, x=4, y=5, *atuple, **adict)
在這個例子中,引數3會被放入atuple,引數x=4和y=5會被放入adict
python 函式引數 簡明總結
1.位置引數 必選引數 2.預設引數 3.可變引數 args 4.關鍵字引數 kw 5.命名關鍵字引數 named kw 可變引數 def func args type args tuple func 1,2,3,4 mytuple 1 2,3 func mytuple 允許傳入0個或任意個引數,這...
python引數函式 Python函式引數總結
coding utf 8 整理一下python函式的各種引數型別 位置引數 呼叫函式時,傳入的兩個值按照位置順序依次賦給引數 def power x,n s 1 while n 0 n n 1 s s x return s print power 5,2 預設引數 簡化函式的呼叫 def power...
Python函式傳入引數方式總結
位置引數是最簡單的傳入引數的方式 def func a,b print a b func 1,3 3預設引數是在呼叫函式的時候使用一些包含預設值的引數 def power x,n 2 s 1while n 0 n 1 s n return s可變引數允許在呼叫引數的時候傳入多個引數,這些引數在呼叫時...