Pythonでの可変長引数を受取る方法(*argsと**kwargsの使い方)
![](https://tech.aru-zakki.com/wp-content/uploads/2024/06/python-args.001.jpeg)
この記事では、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
を受け取り、関数g
がage
とsex
を受け取る例です。
可変長キーワード引数を使うと、それぞれの関数が受け取るパラメータを呼び出し側で一括して指定することができます。
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
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
各関数が処理できるものだけを受け取り、他のパラメータは他の関数へ渡す形です。この実装になっているライブラリ、結構ある気がします。
*argと**kwargsを組み合わせる
*arg
と**kwargs
を組み合わせる場合、*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は色々なライブラリでも使われているので可変長引数について理解していると、ライブラリの理解の助けになるかと思います。