談一談python中的魔法變數*args和**kwargs
導讀
最近看了看github大佬寫的程式碼後,發現自己之前寫的程式碼就是個,沒有註釋,沒有封裝,沒有可讀性。哎,幸虧發現及時,現在正在寫一個新的任務,剛好可以好好弄弄架構和程式碼了
在弄程式碼期間發現了*args和**kwargs這兩個引數大佬們有時候經常用,當然最多的其實是在閱讀python自己的原始碼的時候最長見了,今天我終於瞭解清楚它們到底是啥了,大家一起來看!
小小宣告
先弄個宣告哈,*args和**kwargs這種寫法不是必須的,只有前面的 * 才是必須的。當然你也可以寫成*var和**vars,而寫成*args和**kwargs是一個約定俗成的一個命名規範而已。
*args的用法
*args和**kwargs主要用於函式定義。功能是將不確定數量的引數傳遞給一個函式。
這裡說說*args,它是用來發送一個非鍵值對的可變數量的引數列表給一個函式。
吃個栗子:
def test_var_args(f_arg, *args): print("first normal arg:", f_arg) for arg in args: print("another arg through *args:", arg) test_var_args('zero', 'one', 'two', 'three')
輸出結果為:
first normal arg: one another arg through *args: one another arg through *args: two another arg through *args: three
懂了吧,咱們進行下一個**kwargs!
**kwargs的用法
上面的*args說的是非鍵值對,所以這裡肯定就是鍵值對啦。如果你想要一個函式裡傳入帶名字的引數,就可以用**kwargs。
吃個栗子:
def test_var_kwargs(**kwargs): for key, value in kwargs.items(): print("{0} == {1}".format(key, value)) >>> test_var_kwargs(arg0="zero",arg1="one") arg0 == zero arg1 == one
簡單吧。接下來我們談談如何使用*args和**kwargs來呼叫一個引數為列表或字典的函式!
使用*args和**kwargs來呼叫函式
假設你要實現這樣的一個函式:
def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", arg2) print("arg3:", arg3)
你可以這樣使用*args和**kwargs:
# 首先使用 *args >>> args = ("two", 3, 5) >>> test_args_kwargs(*args) arg1: two arg2: 3 arg3: 5 # 現在使用 **kwargs: >>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5} >>> test_args_kwargs(**kwargs) arg1: 5 arg2: two arg3: 3
*args和**kwargs的使用順序
如果你想要使用所有的引數情況的話,他們的順序是這樣的:
some_func(fargs, *args, **kwargs)
*args是可變的positional arguments列表,**kwargs是可變的keyword arguments列表。並且,*args必須位於**kwargs之前,因為positional arguments必須位於keyword arguments之前。
如何一起學習,有沒有免費資料?
對Python開發技術感興趣的同學,歡迎加QQ群:865597862,一起學習,相互討論。
群內已經有小夥伴將知識體系整理好(原始碼,筆記,PPT,學習視訊),歡迎加群免費領取。