*args / **kwargs: 可変長引数
引数の数が不定な関数を作る。デコレータの必須知識。
*args
可変長の位置引数(タプル)。
**kwargs
可変長のキーワード引数(辞書)。
アンパック
*list や **dict で展開。
*args / **kwargs
`*args` は余った位置引数を「タプル」として受け取り、`**kwargs` は余ったキーワード引数を「辞書」として受け取ります。これを使えば、引数の数が決まっていない柔軟な関数や、他の関数へ引数をそのまま中継するラッパー関数を作れます。
# *args: 可変長の位置引数def greet(*names): for name in names: print(f"Hello, {name}!")
greet("Alice", "Bob", "Carol")
# **kwargs: 可変長のキーワード引数def build_profile(**info): return info
profile = build_profile(name="Alice", age=30, city="Tokyo")# {'name': 'Alice', 'age': 30, 'city': 'Tokyo'}
# 両方組み合わせdef func(a, b, *args, **kwargs): print(a, b) # 必須引数 print(args) # タプル print(kwargs) # 辞書Bad
# ❌ Bad: 引数を個別に列挙def create_user(name, age, email, city, phone): passGood
# ✅ Good: **kwargs で柔軟にdef create_user(name, **details): passパターン
# アンパック呼び出しdef add(a, b, c): return a + b + c
nums = [1, 2, 3]add(*nums) # 6
config = {'a': 1, 'b': 2, 'c': 3}add(**config) # 6
# デコレータで活用def log_calls(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper
@log_callsdef calculate(x, y): return x + y
# キーワード専用引数(* の後)def func(a, b, *, required_kwarg): pass# func(1, 2, required_kwarg=3) # OK# func(1, 2, 3) # Error! Tip: デコレータは *args, **kwargs で元の関数の引数を透過的に渡す。
合格ライン
*args と **kwargs を使える
呼び出し時のアンパックができる
演習課題
課題1: *args
任意の数の引数を受け取る関数を作成してください。
課題2: **kwargs
キーワード引数を辞書として受け取る関数を作成してください。