[Python] *args 和 **kwargs 是什麼?一次搞懂它們!
在翻閱 Python 的函式庫時常常會看到定義參數的地方放了 *args 和 **kwargs 這樣的東西,這究竟是什麼呢?讓我們先談談函式參數的定義。 預設參數 一般的定義方法就不多說了,直接來看有預設值的參數: def plus(a, b, c=None): res = a + b + (c if c else 0) return res 預設參數的用處通常是實作函式重載用的,可以使一個函式在接受引數時更有彈性,而要注意的語法問題是:預設參數在函式定義時一定要放在非預設參數的後面。 但如果我們想實作無限版的 plus() 函式呢?總不可能一直增加預設參數吧! 這時候我們可以用「*」來將引數收集到一個 tuple 中。 * -收集至 Tuple 先來看看範例: def plus(*nums): res = 0 for i in nums: res += i return res 透過 * 收集的引數會被放到一個 tuple 中,所以我們可以使用 for 來對它進行迭代。 這樣就可以理解為什麼要使用 *args 這個參數了,但是 **kwargs 又是什麼呢?我們要先從關鍵字引數來說起: 關鍵字引數 Keyword Argument 在呼叫 print() 時,我們有時會指定 sep 參數做為分隔輸出的字元,或是使用 end 參數來更改最後的換行字元。像這樣不用理會參數的真正順序,而只要給定名字然後指定值的情況,就是在使用關鍵字引數。 如果我們要指定的參數太多而造成版面不簡潔的話,可以考慮使用「**」來拆解一個裝有參數名與值的 dict。 ** 第一招-拆解 Dict 原諒我使用這麼中二的小標題XDD 直接看實例應該就能懂了: dt = {'sep': ' # ', 'end': '\n\n'} print('hello', 'world', **dt) # 等同於 print('hello', 'world', sep=' # ', end=...