2013年4月20日 星期六

python在函式參數傳遞上的重要基礎概念: *args 與 **kwargs 到底有啥不一樣呢?



好!!為啥會談論到這個東西?!因為python跟一般所學的C/C++很不一樣


一般來說  在呼叫函式的時候  是以  argument = parameter  的方式傳入
                                                              (引數)        (參數)

而python在引數(arguments)這一塊有所謂的匹配模式(match pattern)概念在。

Q: 至於Python有那些的匹配模式呢!?
 ANS:
一般來說可以分成兩種狀況:
”位置”的方式來匹配
            ----由左到右的方式進行匹配
”關鍵字”的方式來匹配
            ---- 以引數的名稱來進行匹配
  

而引數在設定有兩種額外的方法:

1. 引數預設值
            在python的函式中可以指定引數的預設值。(以name=value的型式)
            ex:   func( x=3, y=2, z=1)

2. 變動引數(varargs)

-- python中,在函式宣告時可以利用萬用字元(*)來收集任意數量的額外引數(此概念是源自於C語言的varargs) ;

-- 而函式在呼叫時,可以用萬用字元(*)將引數集合體給分解成個別的引數,表示欲傳遞任意多個引數。




[Function定義語法格式]


def  function_name(param1=arg1, param2=arg2, ....):
      """ 
           Here is function body !!!
      """



[引數的匹配方式]

呼叫    

語法                       位置           說明                                              
func(value)                  呼叫者    普通引數: 以"位置"來匹配。
func(name=value)        呼叫者    關鍵字引數:以"名稱"來匹配。
func(*name)                呼叫者    把name之中所有物件傳遞進來,當作個別的位置引數
func(**name)              呼叫者    把name之中的所有key/value pairs傳遞進來,當成個別關鍵字引數

*/**在呼叫時,是解開任意數量之引數


定義

def  func(name)              函式     普通引數: 以"位置"或"名稱"的方式去匹配
def  func(name=value)    函式     預設引數值(如果在沒呼叫時傳遞)
def  func(*name)            函式     先匹配再收集剩餘的"位置引數"在tuple
def  func(**name)          函式     先匹配再收集剩餘的"關鍵字引數"在dict(辭典)

*/**在定義時,是建立任意數量之引數




Reference:
http://www.loliman3000.com/tech/2fe2eea4a80e94fd3811629.php




沒有留言:

張貼留言