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

提供:Dev Guides
移動先:案内検索

序章

関数定義では、パラメータは、特定の関数が受け入れることができる引数を指定する名前付きエンティティです。

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

前提条件

Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)

*argsを理解する

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

情報:このチュートリアルのサンプルコードに従うには、python3コマンドを実行して、ローカルシステムでPythonインタラクティブシェルを開きます。 次に、>>>プロンプトの後に例を追加して、例をコピー、貼り付け、または編集できます。


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

Lets_multiply.py

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

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

Lets_multiply.py

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

multiply(5, 4)

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

python lets_multiply.py

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

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'}

現在使用しているPython3のバージョンによっては、辞書のデータ型が順序付けされていない場合があります。 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

上記のプログラムを、別の変数名を持つ反復可能なリストデータ型に変更することもできます。 また、*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)

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の使用は、主に読みやすさと利便性を提供するためですが、注意して行う必要があります。