関数の引数には、固定の数を受け取る以外にも、可変長で複数の値を受け取る方法や、
専用の引数として制限をつける方法があります。
今回は *args
や **kwargs
の基本的な使い方と、
キーワード専用引数・位置専用引数の記法について学びました。
*args:複数の位置引数をまとめて受け取る
*args
を使うと、任意の数の位置引数をタプルとして受け取ることができます。
def show_args(*args):
print("受け取った位置引数:", args)
show_args(1, 2, 3)
show_args("A", "B")
受け取った位置引数: (1, 2, 3)
受け取った位置引数: ('A', 'B')
関数を呼び出すときに複数の値を渡すと、それらが args
というタプルにまとめられます。
**kwargs:複数のキーワード引数をまとめて受け取る
**kwargs
を使うと、任意の数のキーワード引数を辞書として受け取ることができます。
def show_kwargs(**kwargs):
print("受け取ったキーワード引数:", kwargs)
show_kwargs(name="太郎", age=30)
show_kwargs(country="Japan", lang="Japanese")
受け取ったキーワード引数: {'name': '太郎', 'age': 30}
受け取ったキーワード引数: {'country': 'Japan', 'lang': 'Japanese'}
**kwargs
を使えば、柔軟に名前付きの引数を処理できます。
* と ** の違いと組み合わせ
*args
は 位置引数のタプル、
**kwargs
は キーワード引数の辞書 をそれぞれ受け取ります。
両方使う場合の順番は以下の通りでないとエラーになります:
def example(a, *args, **kwargs):
pass
キーワード専用引数(*の後に書く)
Python では *
を明示的に使うことで、それ以降をキーワード専用引数にすることができます。
def introduce(name, *, age, country):
print(f"{name}さんは{age}歳で、{country}出身です。")
introduce("花子", age=25, country="日本") # OK
# introduce("花子", 25, "日本") # NG(TypeError)
花子さんは25歳で、日本出身です。
*
のあとの引数は必ず age=25
のようにキーワード形式で渡す必要があります。
位置専用引数(/ の前に書く)※Python 3.8 以降
Python 3.8 以降では、/
を使って位置専用引数を明示的に定義できます。
def area(width, height, /):
print("面積:", width * height)
area(4, 5) # OK(位置引数のみ)
# area(width=4, height=5) # NG(TypeError)
面積: 20
/
より前にある引数は キーワード指定では渡せなくなります。
引数の順番まとめ(初心者向けに図解)
Pythonの関数では、次の順番で引数を並べる必要があります:
def 関数名(
① 位置専用引数, # `/` の前に書く
/,
② 通常の引数, # `/` と `*` の間に書く(位置でもキーワードでもOK)
③ *args, # 可変長の位置引数(タプルで受け取る)
④ キーワード専用引数, # `*` の後に書く(キーワードでしか渡せない)
⑤ **kwargs # 可変長のキーワード引数(辞書で受け取る)
):
✅ 具体的な例
def example(a, b, /, c, *args, d=1, **kwargs):
print(a, b, c, args, d, kwargs)
引数 | 種類 | 説明 |
---|---|---|
a , b
|
位置専用引数 |
/ の前にあるので キーワード指定はできない
|
c |
通常の引数 | 位置でもキーワードでも指定可能 |
*args |
可変長の位置引数 | 追加の位置引数をすべてタプルで受け取る |
d=1 |
キーワード専用引数 |
* より後にあるので キーワード指定が必要
|
**kwargs |
可変長のキーワード引数 | 追加のキーワード引数をすべて辞書で受け取る |
🔎 呼び出し例
example(1, 2, 3, 4, 5, d=10, x=99, y=100)
1 2 3 (4, 5) 10 {'x': 99, 'y': 100}
このように、引数の並び順にはルールがあるので、それぞれの役割と位置を整理して覚えておくと安心です。
おわりに
*args
や **kwargs
は使いこなせると関数の柔軟性が大きく広がります。
また、*
や /
を使った専用引数の記法も、明示的に引数の使い方を制限できる便利な機能でした。
最初は複雑に感じましたが、引数の種類と順番を整理すれば、少しずつ理解が深まっていくように思います。