1. 程式人生 > >python 函式引數(必選引數、預設引數、可選引數、關鍵字引數)

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