Pythonの関数定義では、必ずしも引数の数を固定する必要はありません。
実際のプログラミングでは「引数の数が決まっていない関数」を作りたい場面が多くあります。 そんなときに便利なのが、可変長引数と呼ばれる仕組みです。
Pythonでは主に *args と **kwargs を使うことで、柔軟に引数を受け取ることができます。
今回は、初心者でも分かりやすいように、この二つの使い方を具体例とともに解説していきます。
まず最初に登場するのが *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 について見ていきましょう。*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 の順番で書く必要があります
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 を組み合わせれば、非常に柔軟で拡張性の高い関数を作ることが可能です。 プロジェクトが大きくなると、さまざまなパターンの引数を処理する必要が出てくるため、このテクニックは知っておくととても役立ちます。
可変長引数を活用すると、引数の数に縛られない柔軟な関数を作ることができます。 特に実務や大規模なプログラムでは、引数の内容が状況によって変わるケースが多いため、この知識を持っているとコードの再利用性がぐっと高まります。