參數

定義function時,我們需要定義他的參數。但對於參數,我們可以做到的不僅僅是定義。

參數預設值

首先,在定義參數時,我們通常會寫成def func(arg1,arg2),但是其實我們可以幫arg1arg2預先賦予值,以防哪天使用者忘了給值,造成程式出現問題。

以下為在基礎篇我們舉的加法例子,只是我們在定義時,把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會被丟入kwargsdict的方式儲存。

這種寫法在遇到class時最常見到,因為我們的class有可能會繼承別人,但是父類別的參數,有可能子類別根本不需要,於是def __init__(*argv,**kwargs)就可以處理這種情況,然後在這之下呼叫super(子類別名,self).__init__(*argv,**kwargs),就可以連父類別一起初始化,並且順利將參數傳遞過去。

Type of args, kwargs

那究竟argskwargs是什麼呢? args其實是一個listkwargs會是一個dict。而當我們呼叫super(子類別名,self).__init__(*argv,**kwargs),原先的argvkwargs會在參數列展開,如果沒有***,就只是傳遞一個listdict進去。

results matching ""

    No results matching ""