Python 3で* argsと** kwargsを使用する方法

前書き

function definitionsでは、parametersは、特定の関数が受け入れることができる引数を指定する名前付きエンティティです。

プログラミングするとき、コードのすべての可能なユースケースに気付かない場合があり、モジュールを使用する将来のプログラマー、またはコードを操作するユーザーにより多くのオプションを提供したい場合があります。 コードで*args**kwargsを使用することにより、可変数の引数を関数に渡すことができます。

* argsを理解する

Pythonでは、*argsの単一アスタリスク形式をパラメーターとして使用して、キーワード以外の可変長引数リストを関数に送信できます。 アスタリスク(*)はここで重要な要素であることに注意してください。これは、argsという単語が確立された従来のイディオムであるためですが、言語によって強制されることはありません。

2つの引数を使用する典型的な関数を見てみましょう。

lets_multiply.py

def multiply(x, y):
    print (x * y)

上記のコードでは、xyを引数として関数を作成しました。次に、関数を呼び出すときに、xyに対応する数値を使用する必要があります。 s。 この場合、整数5xに渡し、整数4yに渡します。

lets_multiply.py

def multiply(x, y):
    print (x * y)

multiply(5, 4)

これで、上記のコードを実行できます。

python lets_multiply.py

次の出力が表示されます。これは、整数5と4がmultiply(x,y)関数に従って乗算されたことを示しています。

Output20

後で、2つだけでなく3つの数字を掛けたいと判断した場合はどうなりますか? 以下に示すように、関数に追加の番号を追加しようとすると、エラーが表示されます。

lets_multiply.py

def multiply(x, y):
    print (x * y)

multiply(5, 4, 3)
OutputTypeError: multiply() takes 2 positional arguments but 3 were given

したがって、後でさらに引数を使用する必要があると思われる場合は、代わりに*argsをパラメーターとして使用できます。

関数パラメーターとしてxyを削除し、代わりに*argsに置き換えることで、最初の例で示したものと基本的に同じ関数とコードを作成できます。

lets_multiply.py

def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)

このコードを実行すると、これらの関数呼び出しごとに製品を受け取ります。

Output20
90
24
900

*argsを使用して可変長引数リストを関数に送信したため、関数呼び出しに必要な数の引数を渡すことができました。

*argsを使用すると、関数内でさまざまな量のキーワード以外の引数を受け入れる、より柔軟なコードを作成できます。

** kwargsを理解する

**kwargsの二重アスタリスク形式は、キーワード付きの可変長引数dictionaryを関数に渡すために使用されます。 ここでも、2つのアスタリスク(**)が重要な要素です。これは、kwargsという単語が従来から使用されているためですが、言語によって強制されることはありません。

*argsと同様に、**kwargsは、提供したい引数をいくつでも取ることができます。 ただし、**kwargsは、キーワードを割り当てる必要があるという点で*argsとは異なります。

まず、関数に渡す**kwargs引数を単純に出力してみましょう。 これを行う短い関数を作成します。

print_kwargs.py

def print_kwargs(**kwargs):
        print(kwargs)

次に、キーワード付きの引数を関数に渡して関数を呼び出します。

print_kwargs.py

def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

上記のプログラムを実行して、出力を見てみましょう。

python print_kwargs.py
Output{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}

現在使用しているPython 3のバージョンによっては、辞書のデータ型は順序付けられていない場合があります。 Python 3.6以降では、キーと値のペアを順番に受け取りますが、以前のバージョンでは、ペアはランダムな順序で出力されます。

注意すべき重要な点は、kwargsという辞書が作成され、他の辞書と同じように操作できることです。

**kwargsをどのように利用できるかを示す別の短いプログラムを作成しましょう。 ここでは、名前の辞書に挨拶する関数を作成します。 最初に、2つの名前の辞書から始めます。

print_values.py

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")

これで、プログラムを実行して出力を確認できます。

python print_values.py
OutputThe value of your_name is Casey
The value of my_name is Sammy

繰り返しになりますが、辞書は順序付けられていない可能性があるため、出力は最初にCaseyという名前で、または最初にSammyという名前で表示される可能性があります。

次に、関数に追加の引数を渡して、**kwargsが、含めたい引数がいくつでも受け入れられることを示します。

print_values.py

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(
            name_1="Alex",
            name_2="Gray",
            name_3="Harper",
            name_4="Phoenix",
            name_5="Remy",
            name_6="Val"
        )

この時点でプログラムを実行すると、次の出力が表示されますが、順序付けられていない場合があります。

OutputThe value of name_2 is Gray
The value of name_6 is Val
The value of name_4 is Phoenix
The value of name_5 is Remy
The value of name_3 is Harper
The value of name_1 is Alex

**kwargsを使用すると、プログラムでキーワード引数を柔軟に使用できます。 **kwargsをパラメーターとして使用する場合、最終的に関数に渡す引数の数を知る必要はありません。

引数の順序付け

関数または関数呼び出し内で引数を順序付ける場合、引数は特定の順序で発生する必要があります。

  1. 正式な位置引数

  2. *args

  3. キーワード引数

  4. **kwargs

実際には、*argsおよび**kwargsとともに明示的な位置パラメーターを操作する場合、関数は次のようになります。

def example(arg_1, arg_2, *args, **kwargs):
...

また、*args**kwargsに加えて、名前付きキーワードパラメータとともに位置パラメータを操作する場合、関数は次のようになります。

def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):
...

関数を作成するときは、Pythonコードで構文エラーを受け取らないように、引数の順序に留意することが重要です。

関数呼び出しでの* argsおよび** kwargsの使用

*args**kwargsを使用して、引数を関数に渡すこともできます。

まず、*argsの例を見てみましょう。

some_args.py

def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
some_args(*args)

上記の関数には、arg_1arg_、およびarg_3として定義された3つのパラメーターがあります。 関数はこれらの各引数を出力します。 次に、反復可能(この場合はtuple)に設定された変数を作成し、その変数をアスタリスク構文で関数に渡すことができます。

python some_args.pyコマンドを使用してプログラムを実行すると、次の出力が返されます。

Outputarg_1: Sammy
arg_2: Casey
arg_3: Alex

上記のプログラムを、別の変数名を持つ反復可能なlist data typeに変更することもできます。 また、*args構文をnamed parameterと組み合わせてみましょう。

some_args.py

def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

my_list = [2, 3]
some_args(1, *my_list)

上記のプログラムを実行すると、次の出力が生成されます。

Outputarg_1: 1
arg_2: 2
arg_3: 3

同様に、キーワード付きの**kwargs引数を使用して関数を呼び出すことができます。 3つのキーと値のペアを持つ辞書に等しい変数を設定し(ここではkwargsを使用しますが、任意に呼び出すことができます)、3つの引数を持つ関数に渡します。

some_kwargs.py

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)

上記のプログラムをpython some_kwargs.pyコマンドで実行してみましょう。

Outputkwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy

関数を呼び出すときは、*args**kwargsを使用して引数を渡すことができます。

結論

可変数の引数を関数に渡すために、関数定義内で*args**kwargsの特別な構文を使用できます。

*args**kwargsを受け入れる関数を作成することは、引数リスト内の入力の数が比較的少ないままであると予想される状況で最もよく使用されます。 *args**kwargsの使用は、主に読みやすさと利便性を提供するためですが、注意して行う必要があります。