Skip to content

[Python] 基本教學(8) function 中的參數、預設值、*args、 **kwargs

上次簡單教完了如何建立一個最基本的 function,今天來談談就連我個人也很少用的傳入值 —— default, *args, **kwargs。

當然,講解部份可能有點我流,建議大家多動手試試不同的程式碼,不要在意我的廢話。


default

所謂的 default,指的當然便是函式的輸入值『預設數值』。
以下我們來看個簡單的範例。

def test(n, a=1, b=2):
    print(n+a+b)


這是一個再簡單不過 function,看過之前課程的大家想必駕輕就熟:

test(1, 2, 3)


Output:

6

那麼,我所說的 default 到底在哪裡呢?

test(1)


沒錯,這個 function 我們只需要輸入一個參數就可以了!其餘的參數 function 會自動依照預設值來填入。

由此可見,我們的 Output:

4

1 + 1 + 2 = 4 —— 看起來沒有毛病!


*args

那麼,*args 又是個什麼樣的參數呢?直觀地來講,它可以代表著是『沒有限定長度的參數輸入』。

我們以實例來講解:

def test(n, *args):
    a = n
    for arg in args:
        a += arg
   
    print(a)


然後,我們輸入超過兩個輸入值:

test(1, 2, 3, 4, 5, 6)


結果會是什麼呢?

21

1 + 2 + 3 + 4 + 5 + 6 = 21 !

沒錯,也就是說,除了 1 為變數 n 外,其餘都是 *args 的輸入值!

這樣一來,有沒有比較懂我所說的『沒有限定長度的參數輸入』的意思呢?


**kwargs

最後,終於來到今天的重頭戲 —— **kwargs 啦!

跟 *args 相比,我們在輸入參數給 function 的時候,一定要加上變數名,如此一來才能正確地判別那個參數是屬於 **kwargs 的。

順帶一提,在 function 的構成規則中, *args 必須放置在 **kwargs 之前,如此一來,我們程式的 Parser 才不會搞錯我們輸入的語法。

一樣,以下簡單地帶大家看著範例:

def test(n, **kwargs):
    print(n)
    for a, b in kwargs.items():
        print(a, b)


我們可以清楚看到, **kwargs 有著像是 dict 型態一般的東西 (這我在之後的課程中會提到,大概)

於是就像我說的,我們要確實地指定我們要輸入的值。

test(1, key=3, value=9)


Output:

1
key 3
value 9

這樣大家有沒有比較了解了呢?

我當初在學習 Python 的時候,有幸見到並學習過大神開發的代碼,那時候大神總是劈哩啪啦地使用這種 *args、**kwargs ——使用起來一套一套的,看得人眼花撩亂。

事後一直過了好久,我才終於明白當時的程式碼到底是在寫什麼呢!

距離我當初設計要寫的 Python 基本教學,剩下的內容已經不到八個項目啦!漸漸地離我想寫的後續教學越來越近了!我抱持著想分享一些知識給大家的想法也還是沒有變。

希望能寫進階教學課程的那一天盡早到來。


References


Read More

Leave a Reply