Python的keyword argument(關鍵字引數)是什麼?。
原本是先查Python的函式有沒有如同Java的方法多載(Overloading)特性,答案是沒有。那好奇為什麼有些函式可以傳零或多個引數,所以查什麼是*args
及**kwargs
參數所衍伸的問題。
閱讀以下前先要知道引數(argument)與參數(parameter)的區別。
- 引數 argument:傳入函式的值。
- 參數 parameter:函數對可接受引數的定義。
def foo(x, y): # 函式foo定義了兩個參數x, y
pass
foo(1, 2) # 呼叫foo函式傳入兩個引數1, 2
Pythont呼叫函式(function)時傳入的引數(argument)有兩種類型。
- positional argument:傳入值前不指定參數名或傳入的iteralbe前加上
*
。 - keyword argument:傳入值前指定參數名(e.g.
name=john
)或在傳入的dictionary前加上**
。
positional argument 位置引數
positional argument很好理解,就是引數依函式參數的順序傳入,在C語言或Java的函式(方法)都是這種。
例如下面定義一個minus(x, y)
函式有兩個參數,依傳入的引數值順序來決定結果。
def minus(x, y):
return x - y
print(minus(2, 1)) # 1
print(minus(1, 2)) # -1
print(minus(*(2, 1))) # 1
print(minus(*(1, 2))) # -1
keyword argument 關鍵字引數
keyword argument又稱named argument,函式依引數名(identifier)來使用,而非依引數傳入的順序。
例如下面呼叫同上例的minus(x, y)
函式,傳入的引數值前有加上參數名稱,所以函式會依引數名稱來取用值,傳入順序不影響結果。
def minus(x, y):
return x - y
print(minus(x=2, y=1)) # 1
print(minus(y=1, x=2)) # 1
print(minus(**{'x': 2, 'y': 1})) # 1
print(minus(**{'y': 1, 'x': 2})) # 1
而在定義函式時,參數預設可以用positional argument或keyword argument,就如上面的minus(x, y)
函式。如果要限定參數只能傳keyword argument可使用下面方法。
參數前加上*
函式參數中*
後面的參數為keyword argument。
def func(*, kw_only1, kw_only2):
print(kw_only1, kw_only2)
func(kw_only1='hello', kw_only2='world') # hello world
func('hello', 'world') # 錯誤 - TypeError: func() takes 0 positional arguments but 2 were given
def func(arg, *, kw_only1, kw_only2):
print(arg, kw_only1, kw_only2)
func(1, kw_only1='hello', kw_only2='world') # 1 hello world
func(kw_only1='hello', kw_only2='world') # 錯誤 - TypeError: func() missing 1 required positional argument: 'arg'
參數放在var-positional parameter後面
函式參數中var-positional parameter後面的參數為keyword argument。var-positional parameter為參數前面加上*
,例如*args
,代表零或多個positional parameter。
def func(*args, kw_only1, kw_only2):
print(args, kw_only1, kw_only2)
func(1, 2, 3, kw_only1='hello', kw_only2='world') # (1, 2, 3) hello world
func(kw_only1='hello', kw_only2='world') # () hello world
func(1, 2, 3) # 錯誤 - TypeError: func() missing 2 required keyword-only arguments: 'kw_only1' and 'kw_only2'
而**kwargs
參數就是代表任意長度的keyword argument參數,又稱var-keyword parameter。參數名前加上**
即為var-keyword parameter,其實就是一個dictionary(dict
)物件。
def func(**kwargs):
print(kwargs) # {'a': 1, 'b': 2}
print(kwargs['a']) # 1
print(kwargs['b']) # 2
for key, value in kwargs.items():
print(key, '=', value)
func(a=1, b=2)
def func(**keyword_arguments):
print(keyword_arguments) # {}
func()
沒有留言:
張貼留言