網頁

2021/2/19

Python 什麼是關鍵字引數 keyword argument

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()


沒有留言:

張貼留言