參數
定義function時,我們需要定義他的參數。但對於參數,我們可以做到的不僅僅是定義。
參數預設值
首先,在定義參數時,我們通常會寫成def func(arg1,arg2)
,但是其實我們可以幫arg1
與arg2
預先賦予值,以防哪天使用者忘了給值,造成程式出現問題。
以下為在基礎篇我們舉的加法例子,只是我們在定義時,把b
預設為1
。所以當我們呼叫add(1)
,函式其實會當成是add(1,1)
回傳2。而當我們呼叫add(1,2)
,原先被預設的b
則會被改成2
,因此還傳值為3
。
def add(a,b=1):
c = a + b
return c
指定參數值
在使用funtion時,我們使用add(1,2)
直接將值丟入function,然而我們其實可以決定值要丟給哪個參數。以上面的例子為例,add(b=5,a=3)
會被當成是add(3,5)
,因此會回傳8
。
Some Trick
在開發程式時,我們通常都會幫我們的function預設一些初始值,一方面可以避免使用者忘記輸入,另一方面又可以提供某種程度上的便利性。
args, *kargs
在使用別人寫好的套件時,我們常常看到有些function參數會宣告成(a,b,*args,**kwargs)
。這樣子宣告有兩種好處,第一種好處是當使用者輸入超過兩個參數時不會跳出error,而是多餘的參數會被送入argv
、第二種好處是使用者如果不小心將值賦予了不存在的參數,例如(1,2,c=3)
,那麼c=3
會被丟入kwargs
以dict
的方式儲存。
這種寫法在遇到class時最常見到,因為我們的class有可能會繼承別人,但是父類別的參數,有可能子類別根本不需要,於是def __init__(*argv,**kwargs)
就可以處理這種情況,然後在這之下呼叫super(子類別名,self).__init__(*argv,**kwargs)
,就可以連父類別一起初始化,並且順利將參數傳遞過去。
Type of args, kwargs
那究竟args
跟kwargs
是什麼呢?
args
其實是一個list
而kwargs
會是一個dict
。而當我們呼叫super(子類別名,self).__init__(*argv,**kwargs)
,原先的argv
跟kwargs
會在參數列展開,如果沒有*
跟**
,就只是傳遞一個list
跟dict
進去。