【Python】関数の可変長引数
*args(位置引数の可変長引数)
Pythonでは、関数に渡す引数の数が決まっていない場合に*args
を使用できます。
*args
はタプルとして受け取られるため、複数の値を可変長で渡すことができます。
基本的な使用例
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # 10
print(sum_numbers(10, 20)) # 30
print(sum_numbers()) # 0
ループを用いた処理
def print_names(*names):
for name in names:
print(f"こんにちは、{name}さん!")
print_names("太郎", "花子", "次郎")
デフォルト引数と組み合わせる
def greet(message, *names):
for name in names:
print(f"{message}, {name}!")
greet("おはよう", "田中", "佐藤", "鈴木")
**kwargs(キーワード引数の可変長引数)
**kwargs
を使用すると、関数は任意の数のキーワード引数を辞書として受け取ることができます。
基本的な使用例
def person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
person_info(name="田中", age=30, city="東京")
辞書を利用する
data = {"name": "佐藤", "age": 25, "job": "エンジニア"}
def display_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
display_info(**data)
*argsと**kwargsの組み合わせ
*args
と**kwargs
を同時に使うことで、位置引数とキーワード引数の両方を柔軟に受け取ることができます。
例
def example_function(*args, **kwargs):
print("位置引数:", args)
print("キーワード引数:", kwargs)
example_function(1, 2, 3, name="山田", age=40)
順番に注意
関数定義の際、引数の順番は次のようにする必要があります:
- 通常の引数
- *args(可変長位置引数)
- 通常のキーワード引数
- **kwargs(可変長キーワード引数)
def correct_order(a, b, *args, x=10, y=20, **kwargs):
print(a, b, args, x, y, kwargs)
correct_order(1, 2, 3, 4, x=50, y=60, z=100)
可変長引数の応用例
複数の数値を受け取り計算
def multiply(*numbers):
result = 1
for num in numbers:
result *= num
return result
print(multiply(2, 3, 4)) # 24
辞書のマージ
def merge_dicts(**dicts):
merged = {}
for key, value in dicts.items():
merged[key] = value
return merged
print(merge_dicts(a=1, b=2, c=3))
デコレーターでの活用
def debug(func):
def wrapper(*args, **kwargs):
print(f"呼び出し: {func.__name__}({args}, {kwargs})")
return func(*args, **kwargs)
return wrapper
@debug
def add(a, b):
return a + b
print(add(3, 5))
可変長引数の注意点
辞書のキーは文字列のみ
def invalid_kwargs(**kwargs):
for key in kwargs:
print(key, kwargs[key])
# invalid_kwargs(123="数値キー") # エラーになる
可変長引数を辞書やリストで展開
def greet(name, age):
print(f"私は{name}です。{age}歳です。")
data = ("田中", 30)
greet(*data) # リスト・タプルを展開
data_dict = {"name": "佐藤", "age": 40}
greet(**data_dict) # 辞書を展開
可変長引数のデフォルト値
def func(*args):
args = args or ("デフォルト",)
print(args)
func() # ('デフォルト',)
func(1, 2, 3) # (1, 2, 3)
Pythonの可変長引数を適切に活用すれば、汎用的で柔軟な関数を定義することができます。