【Python】複数の引数を受け取る可変長引数:*argsと**kwargsの使い方

時計 2020.10.02 / 時計

【Python】複数の引数を受け取る可変長引数:*argsと**kwargsの使い方

Pythonを勉強していれば一度はお目にかかる「*args」と「**kwargs」。
初めて見たとき、見た瞬間に拒否反応が出たのは私だけじゃないはず!!

これらは関数の引数に使われており、いろいろな場面で使用されています。

本記事では、「*args」と「**kwargs」を見た感じ難しそうだから今まで避けてきた方・初めて存在を知った方に向けて、わかりやすく解説していきます。

*argsと**kwargsの共通点

*argsと**kwargsは以下のように関数の引数で使われます。

def Office(*args):
	…
def Fivefore(**kwargs):
	…

これらは可変長引数と呼ばれます。

IT用語の確認

可変長引数とは、名前からもわかるように長さが変わる引数、長さが固定ではないという意味です。つまり任意の数の引数を受け取ることができる引数です

引数を可変長引数に変身させるためには、「*」(アスタリスク)を先頭に付けてあげます。
何個アスタリスクを付けるかによって、可変長引数の能力は変わってきます。

そう、アスタリスクの数が重要なのです。

そして、argsやkwargsというのは全く重要ではないです。なんなら*officeや**fivefourでもいいです。

ではなんでこの可変長引数を使うのか?
それは複数の変数をまとめたり、任意の数の引数を関数に渡せるようにするためです。
つまり、引数の要素数が決まっていない場合に有用だということですね。

重要なポイント

関数の引数に使われる

可変長引数と呼ばれる

*(アスタリスク)の数が重要

*(アスタリスク)の後の文字列は何でもよい

argsとkwargsという名前を付けるのが通例なだけ

*argsの使用方法

*argsとは

上記の共通点を念頭に置き、*argsについて詳しく見ていきましょう。

結論から言うと、*argsは複数の引数をタプルで一つにまとめる役割をしています。

これだけの説明だとさっぱりだと思うので、例を使って説明します。

def language(a, b, c):
	print(a)
	print(b)
	print(c)

language("Japanese", "English", "Spanish")
# Japanese
# English
# Spanish

上記はlanguage関数に引数を3つ渡して、それぞれprintで出力しています。

ではこのプログラムを*argsを使って書き換えてみましょう。

def language(*args):
    for arg in args:
        print(arg)

language("Japanese", "English", "Spanish")

上記プログラムでは、language関数に渡された3つの引数をargsにタプルで1つにまとめています。

argsというタプルの箱に3つの引数を入れて、for文でその中身をすべてprintしているというわけですね。

ちなみにargsとは、arguments(引数)を省略した形です。

シングルアスタリスク*の意味

共通点の項で説明しましたが、重要なのはアスタリスク*の数です。

アスタリスク*が一つ引数に付くと、複数の引数をタプルで受け取ります。

他の引数と*argsを同時に使用する

可変長引数はそれだけで使用しなければならない、というわけではないです。

もちろん他の引数と可変長引数の両方を同時に用いることは可能です。
以下サンプルプログラムは位置引数と可変長引数を組み合わせています。

def language(a, b, *args):
    print(a)
    print(b)
    for arg in args:
        print(arg)

language("Japanese", "English", "Spanish", "French", "Chinese")

ここで注意点としては、
*argsは位置変数よりも先にきてはいけない
ということです。

どういうことかというと、以下のサンプルプログラムを使って説明します。

def language(*args, a, b):
    print(a)
    print(b)
    for arg in args:
        print(arg)

language("Japanese", "English", "Spanish", "French", "Chinese")

上記のプログラムを実行すると以下のようなエラーが表示されます。

TypeError: language() missing 2 required keyword-only arguments: 'a' and 'b'

これは、先に*argsを置いたことにより、aとbに引数が入らなかったことを意味します。

位置引数と*argsを同時に使用する場合は、それらの位置に注意しましょう。

**kwargsの使用方法

**kwargsとは

それでは次に**kwargsについてみていきましょう。

**kwargsは複数のキーワード引数(キー=値)を辞書で受け取る役割をしています。

では以下サンプルプログラムで理解を深めましょう。

def language(**kwargs):
    print(kwargs)
    print(type(kwargs)

language(first="Japanese", second="English", third="Spanish")
# {'first': 'Japanese', 'second': 'English', 'third': 'Spanish'}
# <class ‘dict’>

上記プログラムでは、language関数に渡された3つのキーワード引数(キー=値)をkwargsは辞書として受け取っています。

ちなみにkwargsとは、key word arguments(キーワード引数)を省略した形だと思います。

ダブルアスタリスク**の意味

アスタリスク*が2つ引数に付くと、複数の引数を辞書で受け取ります。

キーワード引数を辞書型として、キーワードと与えられた値を受け取るということですね。

アスタリスク1つでタプル、アスタリスク2つで辞書と覚えましょう。

他の引数と**kwargsを同時に使用する

*argsと同様に、**kwargsも他の引数と同時に使用することができます。

以下サンプルプログラムは位置引数と可変長引数を組み合わせています。

def language(a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)
language("Japanese", "English", third="Spanish", forth="French", fifth="Chinese")

# Japanese
# English
# {'third': 'Spanish', 'forth': 'French', 'fifth': 'Chinese'}

*argsと同様で、**kwargsの後に位置変数を置くとエラーが発生しますので、位置に注意してください。

まとめ

本記事で解説してきたように、*argsと**kwargsで複数の引数をまとめて扱うことができるようになります。

引数をタプル化したり、辞書化することでプログラムに幅がでますね。