Pythonでは、関数に可変長引数を定義できます。これは具体的な引数の名前を省略し、適当に引数を扱う方法です。この記事では、Pythonの可変長引数(args, *kwargs)にリスト、タプル、辞書を展開して渡す方法について解説します。
可変長引数、*args
たとえば以下のように関数を定義します。
def func(*args):
print(args)
func(1, 2, 3)
上記のコードを実行すると以下のような結果になります。
(1, 2, 3)
関数側(func)の args という引数が可変長引数です。この引数を使うと、関数の具体的な引数名を省略することができます。args にはタプルで関数の呼び出し側の引数がパックされます。そのため *args に対して添え字でアクセスすると呼び出し側の引数を取り出せます。
可変長キーワード引数
可変長引数にはキーワード引数版もあります。たとえば以下のように関数を定義します。
def func(**kwargs):
print(kwargs)
func(a=1, b=2)
上記のコードを実行すると以下のような結果になります。
{'a': 1, 'b': 2}
関数側の kwargs という引数は可変長のキーワード引数です。これは辞書として機能します。関数の呼び出し側で func (a=1, b=2) などと引数を指定しすると、キーと値が kwargs にパックされて渡されます。**kwargs は辞書なので、辞書として引数にアクセスできます。
可変長引数にリストをアンパックして渡す
リストやタプルは*lisのようにアスタリスクを付けるとアンパック(展開)することができます。つまりリストなどの各要素が展開されて関数の引数に渡されるということになります。
def func(*args):
print(args)
lis = [1, 2, 3]
func(*lis)
上記のコードを実行すると以下のような結果になります。
(1, 2, 3)
これは可変長引数でない場合も渡すことができます。ただしその場合は引数の数と、アンパックした要素の数が一致している必要があります。
可変長キーワード引数に辞書をアンパックして渡す
辞書は**dのようにアスタリスクを2つつけると、アンパックできます。可変長キーワード引数を持つ関数などに辞書を展開して渡せます。
def func(**kwargs):
print(kwargs)
d = {'a': 1, 'b': 2}
func(**d)
上記のコードを実行すると以下のような結果になります。
{'a': 1, 'b': 2}
これは可変長キーワード引数でない場合も同様です。この場合も引数の数と辞書の要素の数が一致している(キーが存在している)必要があります。
まとめ
Pythonの可変長引数(args, *kwargs)にリスト、タプル、辞書を展開して渡す方法について解説しました。これらのテクニックはPythonプログラミングにおいて非常に便利で、覚えておくと良いでしょう。