<一覧に戻る

Pythonの可変長引数( *args と **kwargs)

Pythonの関数定義では、必ずしも引数の数を固定する必要はありません。

実際のプログラミングでは「引数の数が決まっていない関数」を作りたい場面が多くあります。 そんなときに便利なのが、可変長引数と呼ばれる仕組みです。

Pythonでは主に *args と **kwargs を使うことで、柔軟に引数を受け取ることができます。

今回は、初心者でも分かりやすいように、この二つの使い方を具体例とともに解説していきます。

*args で複数の位置引数を受け取る

まず最初に登場するのが *args です。これは好きなだけ引数を渡してよいという意味を持っています。 通常の引数は決められた数だけしか渡せませんが、*args を使うと いくつでも引数を渡せて、それらをまとめてタプルとして受け取ることができます。

サンプルコード

def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

result = sum_numbers(1, 2, 3, 4, 5)
print(result)  # 出力: 15

この関数 sum_numbers は、*args を利用して任意の数の数値を受け取ります。

関数の内部では *args がタプルとして扱われるため、forループで一つずつ取り出して合計を計算しています。 呼び出し時にsum_numbers(1, 2, 3, 4, 5)と5つの引数を渡しましたが、関数側ではすべて問題なく処理でき、結果として 15 が返ってきます。

このように、*args を使うと「引数が2つのときもあれば、10個のときもある」といった柔軟な関数を作ることができます。

**kwargs でキーワード引数をまとめて受け取る

次に *kwargs について見ていきましょう。*args が位置引数をまとめるのに対して、*kwargs は キーワード付きの引数をまとめて受け取る 役割を持ちます。**kwargs は「keyword arguments(キーワード引数)」の略で、関数の中では辞書(dict)として扱われます。

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=30, city="Tokyo")

この関数 print_info では、**kwargs によって任意の数のキーワード引数を受け取ることができます。引数は辞書のように {キー: 値} の形で渡され、items() を使うことでキーと値を順番に取り出して表示しています。

呼び出し時に print_info(name="Alice", age=30, city="Tokyo") と書くと、以下のように出力されます。

name: Alice
age: 30
city: Tokyo

つまり、引数の数や内容が決まっていなくても、柔軟に受け取って処理できるのが **kwargs の大きな特徴です。

*args と **kwargs を同時に使う

さらに便利なのが、*args と **kwargs を同時に使う方法です。

この組み合わせを使うことで、位置引数もキーワード引数も自由に受け取れる関数を作ることができます。

注意点としては、定義するときの順番があり、通常の引数 → *args → **kwargs の順番で書く必要があります

def describe_pet(pet_name, *args, **kwargs):
    print(f"ペットの名前: {pet_name}")
    if args:
        print("特性:")
        for trait in args:
            print(f"- {trait}")
    if kwargs:
        print("情報:")
        for key, value in kwargs.items():
            print(f"{key}: {value}")

describe_pet("Buddy", "元気", "愛らしい", age=5, breed="Golden Retriever")

この関数 describe_pet では、まず通常の引数としてペットの名前を受け取ります。 その後に *args でペットの性質や特徴をリストのように受け取り、最後に **kwargs で年齢や種類などの追加情報を辞書として受け取ります。

実行すると次のような出力になります。

  ペットの名前: Buddy
  特性:
  - 元気
  - 愛らしい
  情報:
  age: 5
  breed: Golden Retriever

このように、*args と **kwargs を組み合わせれば、非常に柔軟で拡張性の高い関数を作ることが可能です。 プロジェクトが大きくなると、さまざまなパターンの引数を処理する必要が出てくるため、このテクニックは知っておくととても役立ちます。

まとめ

  • *args は可変数の位置引数をタプルとして受け取る
  • **kwargs は可変数のキーワード引数を辞書として受け取る
  • 両方を組み合わせると、位置引数とキーワード引数を自由に扱える

可変長引数を活用すると、引数の数に縛られない柔軟な関数を作ることができます。 特に実務や大規模なプログラムでは、引数の内容が状況によって変わるケースが多いため、この知識を持っているとコードの再利用性がぐっと高まります。

出力結果: