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

前書き

https://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3 [関数定義]、https://www.digitalocean.com/community/tutorials/how-to -define-functions-in-python-3#working-with-parameters [parameters]は、特定の関数が受け入れることができる引数を指定する名前付きエンティティです。

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

* argsを理解する

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

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

lets_multiply.py

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

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

lets_multiply.py

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

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

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 +`を使用できます。

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

lets_multiply.py

def multiply():
   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 」の二重アスタリスク形式は、キーワード付きの可変長引数https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3[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)

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

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_1 」、「 arg_ 」、および「 arg_3 +」として定義された3つのパラメーターがあります。 関数はこれらの各引数を出力します。 次に、反復可能に設定される変数(この場合はhttps://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3[tuple])を作成し、その変数を渡すことができますアスタリスク構文を使用して関数に追加します。

`+ python some_args.py +`コマンドでプログラムを実行すると、次の出力が表示されます。

Outputarg_1: Sammy
arg_2: Casey
arg_3: Alex

上記のプログラムを、異なる変数名を持つ反復可能なhttps://www.digitalocean.com/community/tutorials/understanding-lists-in-python-3[list data type]に変更することもできます。 また、 `+ * args +`構文をhttps://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3#working-with-parameters[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 +`の使用は、主に読みやすさと利便性を提供するためですが、注意して行う必要があります。

前の投稿:Ubuntu 14.04にBaasBoxをインストールして使用する方法
次の投稿:CentOS 7でLet’s Encryptを使用してApacheを保護する方法