可変長引数 args と kwargs

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

可変長引数 args と kwargs とは

*args と **kwargs で可変長引数を扱う方法を学びます。本レッスンでは、可変長引数 args と kwargs の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

可変長引数

関数を作っていると「いくつ引数が来るか分からない」ケースに出会います。たとえば 合計を求める関数 を作るとき、引数が 2 つかもしれないし、10 個かもしれない。こんな場面で活躍するのが *args**kwargs です。Python には、任意個の位置引数とキーワード引数をまとめて受け取る仕組みが用意されています。

*args**kwargs は名前ではなく記号 *** がポイントです。名前は何でも良いのですが、慣例として argskwargs を使います。

*args の使い方

*args は、複数の位置引数をタプルとしてまとめて受け取ります。

Python

def total(*args): return sum(args) print(total(1, 2, 3)) print(total(1, 2, 3, 4, 5))

呼び出し側で渡した値が args という タプル に入ってきます。sum 関数でまとめて合計できます。引数の個数を気にせず関数を呼べるのが大きなメリットです。

引数が 1 つも渡されなかったときは、args は空のタプル () になります。sum(())0 を返すので、呼び出し側が引数を渡さなくても安全に動きます。

kwargs の使い方

**kwargs は、複数のキーワード引数を辞書としてまとめて受け取ります。

Python

def describe(**kwargs): return kwargs result = describe(name="太郎", age=20, city="東京") print(result)

kwargs辞書 (dict) になっていて、キーが引数名、値が渡された値になります。name="太郎" のように書いた呼び出しは、{"name": "太郎"} という辞書として届きます。

通常引数と組み合わせる

*args**kwargs は、普通の引数の後ろに置けます。

Python

def greet(message, *args): print(message) for name in args: print(f" {name} さん") greet("こんにちは", "太郎", "花子", "次郎")

message には先頭の "こんにちは" が入り、残りの 3 つが args というタプルにまとまります。最初に必須の引数を受け取りつつ、追加の引数は何個でも受け付ける、というパターンがよく使われます。

*args**kwargs の両方を取りたい関数も書けます。位置引数は args に、キーワード引数は kwargs にそれぞれ流れます。

Python

def show(*args, **kwargs): return {"args": args, "kwargs": kwargs} print(show(1, 2, name="太郎"))

args には (1, 2)kwargs には {"name": "太郎"} が入って返ります。位置とキーワードがきれいに分かれているのが見て取れます。

動きを追ってみる

可変長引数の振り分けを図にしてみます。

diagram (will load when visible)

位置引数は args に、キーワード引数は kwargs に振り分けられます。仕組みはシンプルです。

よくある間違い

  • def total(args): のように * を忘れる (普通の引数になってしまう)
  • 関数の中で args を辞書のように扱おうとする (*args はタプル)
  • *args**kwargs の順序を逆にする

Python

def bad(**kwargs, *args): pass

これは SyntaxError です。*args が先、**kwargs が後、という順番を覚えておきましょう。

引数が多くなる関数では、設計を見直すサインかもしれません。データクラス辞書 1 つにまとめる方が読みやすいことも多いです。

実例

ログ関数を作るときに **kwargs が便利です。

Python

def log(level, message, **context): return f"[{level}] {message} {context}" print(log("INFO", "login", user_id=42, ip="127.0.0.1"))

コンテキスト情報を自由に付加できる、柔軟なログ関数の出来上がりです。user_idip のように、呼び出すたびに違うキーを渡しても、関数側は context 辞書で受け取れます。

やってみよう

それでは、可変長の数値を受け取って合計を返す関数 sum_all*args で書いてみましょう。sum_all(1, 2, 3) でも sum_all(10, 20) でも動くようにしてください。引数が 0 個のときは 0 を返します。sum 関数を使えば 1 行で書けます。テストでは sum_all(1, 2, 3) のように呼び出されます。

よくある質問

Q. このトピックは Python 以外の言語でも同じ書き方ですか?

A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。

Q. 実行してエラーが出た場合の対処は?

A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。

Q. 次のステップで何を学ぶべきですか?

A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。

次のレッスン

次は lambda 関数** で、*args と kwargs で可変長引数を扱う方法を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. args / kwargs の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. args / kwargs とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン**

要件

  1. *args で可変長引数を受け取る
  2. sum を使って合計を計算する
  3. 引数なしの場合は 0 を返す

入出力例

test-cases.txt

sum_all(1, 2, 3)6 sum_all(1, 2, 3, 4, 5)15 sum_all(42)42 sum_all()0 sum_all(10, -5, 3)8

ヒント

main.py
main.py
学習モード

メモ

可変長引数 args と kwargs

⌘S で保存