はじめに
Python は、世界で最も人気のあるプログラミング言語の1つです。Pythonにおいて、パラメータは関数定義の一部です。これらを使用することで、関数に対して特定の引数を指定することができます。引数は関数によって受け取られ、適用されます。
しかし、コーディングの時点では、自分のコードで具体的にどのようなユースケースが実装されるかを正確に知ることは不可能です。そのため、将来のプログラマーやプログラムのユーザーのために、関数に可変個の引数を渡せるようにしておくことが推奨されます。これを行うには、特別なパラメータを使用する必要があります。それらは *args と **kwargs です。このチュートリアルでは、Pythonにおける *args と **kwargs パラメータについて詳しく学びます。また、引数の順序を指定する方法や、これらを関数呼び出しに適用する方法についても学びます。
前提条件
チュートリアルの手順を進めるには、いくつかの前提条件を準備する必要があります。まず、サーバーにPython 3がインストールされ、プログラミング環境が構築されて稼働している必要があります。また、特定のオペレーティングシステム用のプログラムがインストールされている必要があります(Ubuntu, CentOS、Debianなど)。
*argsとは何か、そしてどのように機能するのか?
まずは、 *args がどのように機能するかを理解することから始めましょう。アスタリスクが1つのバージョンのパラメータは、キーワードなしの可変長引数リストを関数に送信するために使用されます。アスタリスクがそのパラメータにおいて最も重要な要素であることに注意してください。
よりよく理解するために、例を考えてみましょう。以下は、2つの引数を使用する、コード内でよく見られる典型的な関数です:
|
1 2 |
def multiply(x, y): print (x * y) |
ご覧の通り、上記の関数における引数は x と y です。関数を呼び出すときは、 x と y に対応する数値を使用します。たとえば、整数 5 と 4 をそれぞれ x と y として渡すとします:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
それでは、コードを実行してみましょう:
|
1 |
python lets_multiply.py |
受け取る出力は以下のようになります:
|
1 2 3 |
Output: 20 |
出力は、整数5と4が乗算されたことを示しています。これは、 multiply(x, y) 関数が機能したことを意味します。
ここで、最終的に2つではなく3つの数値を乗算したいとします。残念ながら、上記の関数に余分な数値を追加すると、次のようなエラーが発生します:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Output: TypeError: multiply() takes 2 positional arguments but 3 were given |
したがって、後で引数を追加する必要があるかもしれないと考えている場合は、便宜上 *args パラメータを適用します。次のように使用できます:
|
1 2 3 4 5 6 7 8 9 10 |
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) |
単に、関数のパラメータである x と y を *args に置き換えました。このコードを実行すると、次のように関数呼び出しごとの積が得られます:
|
1 2 3 4 5 6 |
Output: 20 90 24 900 |
このように、 *args は、可変長の引数リストを関数に送信したい場合に最適です。その機能により、関数呼び出しに任意の数の引数を渡すことができます。そのため、このパラメータを使用すると、関数に多数の可変長かつキーワードなしの引数を受け入れることができる、より柔軟なコードを構築できます。
**kwargsとは何か、そしてどのように機能するのか?
次に、アスタリスクが2つのバージョンのパラメータである **kwargs があります。前の形式とは異なり、このパラメータを使用すると、キーワード付きの可変長引数辞書を関数に渡すことができます。同様に、 *args, 2つのアスタリスクはパラメータの最も重要な要素です。
前のセクションで行ったように、引数は必要なだけ追加できます。違いは、キーワードを割り当てる必要がある点です。よりよく理解するために、次の例を考えてみましょう。ここでは、まず関数に渡したい **kwargs 引数を出力することから始めます:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
それでは、関数を呼び出してみましょう。ご覧のとおり、キーワード引数を追加しました:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
この時点でプログラムを実行すると、次の出力が表示されます:
|
1 |
python print_kwargs.py |
|
1 2 3 |
出力: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
ただし、辞書データ型が順序付けられていない可能性があります。これは、使用するPython 3のバージョンに大きく依存します。たとえば、Python 3.6以降のバージョンでは、キーと値のペアが順序通りに取得されます。それ以前のバージョンでは、出力がランダムな順序で表示されます。作成する辞書は kwargs. と呼ばれます。これはシステム上の他の辞書と同じように使用および操作できることに注意してください。それでは、 **kwargs パラメータをさらに活用して応用する方法を見てみましょう。
次の例では、名前の辞書に対して挨拶を行う新しい関数を作成してみます。サンプルの辞書には2つの名前が含まれます:
|
1 2 3 4 5 |
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") |
プログラムを実行すると、次の出力が表示されます:
|
1 |
python print_values.py |
|
1 2 3 4 |
出力: The value of your_name is Casey The value of my_name is Sammy |
前の例と同様に、辞書は順序付けられていないように見える場合があります。そのため、場合によっては Casey と Sammy の名前の順序が逆になることがあります。
次に、関数に追加の引数を渡します。これにより、 **kwargs が任意の数の引数を受け取れるようにできることが証明されます:
|
1 2 3 4 5 6 7 8 9 10 11 |
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") |
プログラムを実行すると、次の出力が表示されます:
|
1 2 3 4 5 6 7 8 |
出力: The 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 によって、プログラムに多数 of キーワード引数を使用する柔軟性が得られることを示しています。
引数の順序を指定する方法
関数または関数呼び出しで引数を並べる際は、設定された順序に留意することが重要です。順序は次のとおりです:
-
形式的な位置引数
-
*args
-
キーワード引数
-
**kwargs
たとえば、 *args と **kwargs を明示的な位置パラメータと一緒に使用しているとします。これは、関数が次のようになることを意味します:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
一方、これらのパラメータを名前付きキーワードパラメータと一緒に使用すると、関数は次のような一般的な構造になります。
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
設定された順序に従わない場合、コードを実行したときに構文エラー(SyntaxError)が発生します。したがって、最初からこの間違いを避けるのが最善です。
関数呼び出しで *args と **kwargs を使用する方法
最後に、これら両方のパラメータを使用して関数に引数を渡す方法を説明します。まずは、以下を示す例から始めます。 *args:
|
1 2 3 4 5 6 7 8 |
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) |
この関数には3つのパラメータがあります: arg_1, arg_2、および arg_3。変数を作成し、それをイテラブル(反復可能オブジェクト)に設定する必要があります。この例では、それはtupleになります。その後、アスタリスク構文を使用して、その変数を関数に渡すことができます。
次のコマンドを使用してプログラムを実行したときの出力を確認してください。 python some_args.py コマンド:
|
1 2 3 4 5 |
出力: arg_1: Sammy arg_2: Casey arg_3: Alex |
プログラムを変更して、イテラブルなリストのデータ型にし、別の変数名を指定することも可能です。次のコードは、 *args と名前付きパラメータを組み合わせています:
|
1 2 3 4 5 6 7 8 |
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) |
プログラムを実行すると、出力は次のようになります。
|
1 2 3 4 5 |
出力: arg_1: 1 arg_2: 2 arg_3: 3 |
一方、キーワード引数は **kwargsで適用できます。辞書に等しい変数を作成してください。これには2つのキーと値のペアが含まれている必要があります。以下は、3つの引数を持つ関数にその変数を渡す方法です。
|
1 2 3 4 5 6 7 8 |
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 コマンドをもう一度使用して、プログラムを実行します:
|
1 2 3 4 5 |
出力: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
おわりに
このチュートリアルを終える頃には、何が *args と **kwargsであり、それらがどのように機能するかについて十分に理解できているはずです。これで、これらのパラメータを独自のコードに適用して、将来のユーザーに対してプログラムを柔軟にすることができます。これらは、使用される引数の数がわからない状況に最適です。関数とパラメータの重要な要素に注意するようにしてください。
最後に、Pythonをうまく使いこなすのに役立つ、our blogのその他のリソースをご紹介します:
- txtファイル形式:Python 3でプレーンテキストファイルを操作する
- Python 3におけるループ:break、continue、およびpass文の使用方法
- Python 3でのモジュールのインポート:包括的なガイド
- Python 3の文字列フォーマッタの使用方法
- Python 3プログラミング:クラスの構築とオブジェクトの定義方法
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。