python 函式引數(必選引數、預設引數、可選引數、關鍵字引數)
參考:
########################################################
函式引數:必選引數、預設引數、可選引數、關鍵字引數
########################################################
預設引數:放在必選引數之後
計算x平方的函式:
def power(x):
return x*x
power(5)
計算x的立方
def power(x):
return x*x*x
這樣的話每次計算不同冪函式都要重寫函式,非常麻煩,可使用以下程式碼計算:
def power(x, n): s=1 while n>0: n=n-1 s=s*x return s
使用修改後的power函式,可以計算任意n次方
不過每次呼叫函式必須輸入兩個引數,使用預設引數可以進一步簡化函式:
def power(x, n=2):
s=1
while n>0
n=n-1
s=s*x
return s
設定預設引數時注意事項:必選引數在前,預設引數在後
預設引數最大好處:降低呼叫函式的難度
學生註冊,需要傳入name和gender:
def enroll(name, gender): print 'name :',name print 'gender :',gender
如果繼續傳入年齡、城市等資訊咋麼辦,這會使得呼叫函式的複雜度大大增加:
把年齡、城市設為預設引數可以簡化函式:
def enroll(name, gender, age=6, city='Beijing'):
print 'name :',name
print 'gender :',gender
print 'age :',age
print 'city :',city
有多個預設引數化時,呼叫的時候,既可以按順序提供預設引數,比如呼叫enroll('zj', 'M', 8);也可以不按順序提供部分預設引數,如enroll('Ad', 'a', city='dad')
預設引數也有缺陷的地方:
def add_end(L=[]):
L.append('END')
return L
原因:函式在定義時,預設引數L所制定的地址已經確定,而L是一個list,所以每次呼叫該函式時,如果改變了L的內容,則下次呼叫時,預設引數的內容就會改變
note: 預設引數必須指向不變物件!!!
如上程式碼可使用None實現:
def add_end(L=None):
if L is None:
L=[]
L.append('END')
return L
##################################################################
可變引數:就是傳入的引數個數是可變的,可以是1個、2個到任意個,還可以是0個
在引數前面加上*就是可變引數。在函式內部,引數numbers接收得到的是一個tuple,呼叫該函式時,可以傳入任意個引數,包括0個引數:
def calc(*numbers):
sum=0
for n in numbers:
sum= sum+n*n
return sum
如何呼叫一個list或者tuple,可以如上所示,在list或tuple前面加上一個*號,把list或tuple的元素變成可變引數傳進去
####################################################################
關鍵字引數
允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝成一個dict
使用**表示關鍵字引數
函式person不僅可以只傳入必選引數,也可以傳入任意個數的關鍵字引數
也可以類似可變引數,先組裝一個dict,然後,把該dict轉換為關鍵字引數傳進去:
kw={'city':'Beijing', 'job':'Engineer'}
person('Jack', 24, city=kw['city'], job=kw['job'])
person('Jack' ,24, **kw)
#############################################################
引數組合
引數定義的順序:必選引數、預設引數、可變引數和關鍵字引數
#######################################################
in summary:
預設引數一定要用不可變物件,如果是可變物件,執行會有邏輯錯誤!
*args是可變引數,args接收的是一個tuple;
**kw是關鍵字引數,kw接收的是一個dict