天天看點

談一談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之前。

原文釋出時間為:2018-10-14

本文作者:zenRRan

本文來自雲栖社群合作夥伴“

深度學習自然語言處理

”,了解相關資訊可以關注“

”。