プログラミング
記事内に商品プロモーションを含む場合があります

Pythonの関数で可変長引数を受取る方法(*argsと**kwargsの使い方)

tadanori

この記事では、Pythonで可変長引数を受け取る方法について解説します。可変長引数としては、*args**kwargsがありますが、それぞれについて使い方を説明したいと思います。引数の受け渡しは、たまにしか使わないので忘れてしまいがちです。この記事を読むことで、argsと*kwargsの使い方を再確認しましょう。

可変長引数に関するメモ

以下、可変長引数に関するメモです。

  • 可変長引数の種類は?
    可変長位置引数(*args)と可変長キーワード引数(**kwarg)が存在する
  • *args**kwargsの違いは?
    *argsは任意の数の引数をタプルとして受け取る
    **kwargsは、任意の数のキーワード引数を辞書として受け取る
  • *args**kwargsを両方同時に使える?
    両方同時使うことができるが、*args**kwargsの前になければならない

可変長位置引数(*args)

可変長位置引数(*args)を使うと任意の数の引数をタプルとして関数に渡すことが可能です。例のように、引数は整数、文字列、リストなどさまざまな型を受け取ることができます。

def f(*args):
    print(args)
    for e in args:
        print(e)

f(10, 20, "abc", [1, 2, 3])
# (10, 20, 'abc', [1, 2, 3])
# 10
# 20
# abc
# [1, 2, 3]

引数名は*argsでなくてもOKです。例えば、*elementに変更しても同様の結果になります。

def f(*elements):
    print(elements)
    for e in elements:
        print(e)


f(10, 20, "abc", [1, 2, 3])
# (10, 20, 'abc', [1, 2, 3])
# 10
# 20
# abc
# [1, 2, 3]

応用例
例えば、複数の数値を受け取って、平均値と最大値、最小値を取る関数などを作成することができます。不特定数の引数を受け取って処理したい場合に便利です。

以下は、不特定数の値を受け取って、平均と最大値、最小値を返す例です。

def calc(*args) :
    total = 0
    nmin, nmax = args[0], args[0]
    for i in args :
        total += i
        nmin = min(nmin, i)
        nmax = max(nmax, i)
    return total/len(args), nmin, nmax

print(calc(10,3,40,2))
# (13.75, 2, 40)

可変長キーワード引数(**kwargs)

可変長キーワード引数(**kwargs)は、任意の数のキーワード引数を辞書として関数に渡すことができるものです。アスタリスクが2つ付いていれば、変数名はkwargsでなくて構いません

以下は、**kwargsの例です。

def f(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

f(name="taro", age=30, sex="male")
# name: taro
# age: 30
# sex: male

応用例
可変長キーワード引数は、オプションなどを受け取る場合に利用できます。

下記の例では、キーワードが存在する場合は、パラメータに代入し、存在しない場合は規定値を代入しています。

具体的には、if xxx in kwargsで、xxxが引数に含まれているか確認し、含まれていた場合にはパラメータに代入しています。

def f(**kwargs):
    name, age, sex = None, None, None
    if "name" in kwargs:
        name =  kwargs["name"]
    else :
        name = "no name"
    if "age" in kwargs:
        age = kwargs["age"]
    else :
        age = "no age"
    if "sex" in kwargs:
        sex = kwargs["sex"]
    else :
        sex = "no sex"

    print(name, age, sex)

f(name="taro", age=30, sex="male")
# taro 30 male

このように、可変長キーワード引数は、不特定数のパラメータを受け取る場合に便利です。

関数がさらにパラメータを持った関数を呼び出す場合などにも利用できます。

下記の例は、関数fはパラメータnameを受け取り、関数gagesexを受け取る例です。

可変長キーワード引数を使うと、それぞれの関数が受け取るパラメータを呼び出し側で一括して指定することができます。

def f(**kwargs):
    print(kwargs["name"])
    g(kwargs)

def g(kwargs):
    print(kwargs["age"], kwargs["sex"])

f(name="taro", age=30, sex="male")
# taro
# 30 male

各関数が処理できるものだけを受け取り、他のパラメータは他の関数へ渡す形です。この実装になっているライブラリ、結構ある気がします。

*argと**kwargsを組み合わせる

*arg**kwargsを組み合わせる場合、*argsを手前に記述する必要があります。

argsが手前です。間違えないように!

def f(*args, **kwargs):
    op = "add"
    if "op" in kwargs :
        op = kwargs["op"]

    tot = 0 if op == "add" else 1
    for i in args :
        if op == "add" :
            tot += i
        elif op == "mul" :
            tot *= i
    
    return tot

print(f(1,2,3,4, op="add"))
# 10
print(f(1,2,3,4, op="mul"))
# 24

まとめ

Pythonで可変長引数を利用する方法を説明しました。特に**kwargsは色々なライブラリでも使われているので可変長引数について理解していると、ライブラリの理解の助けになるかと思います。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました