0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】*args, **kwargs と専用引数の使い方

Posted at

関数の引数には、固定の数を受け取る以外にも、可変長で複数の値を受け取る方法や、
専用の引数として制限をつける方法があります。

今回は *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 は使いこなせると関数の柔軟性が大きく広がります。
また、*/ を使った専用引数の記法も、明示的に引数の使い方を制限できる便利な機能でした。

最初は複雑に感じましたが、引数の種類と順番を整理すれば、少しずつ理解が深まっていくように思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?