1. はじめに|Pythonで「引数を自由にしたい」と思ったことは?
Pythonで関数を作っていると、こんなことを思ったことはありませんか?
「この関数、毎回渡す引数の数が違うんだけど…」
「いちいち全部の引数を定義するのって、ちょっと面倒…」
たとえば、データを表示する関数を作るとして、あるときは1つだけ表示、別のときは5個表示、そんな使い方をしたい場面ってありますよね。そんなときに便利なのが、**可変長引数(かへんちょうひきすう)**です!
可変長引数を使えば、引数の数を自由に変えて関数を呼び出すことができるようになります。
「引数の数が決まってなくても大丈夫!」という、ちょっと魔法みたいな仕組みです。
Pythonではこの可変長引数を、
*args(アーグス)→ 位置引数をまとめて受け取る**kwargs(クワーグス)→ キーワード引数をまとめて受け取る
という形で使えます。
本記事では、Python初心者さん向けに「*args」と「**kwargs」の基本の使い方を、やさしく・ゆっくり・具体的に解説していきます。
「関数に引数をたくさん渡したいけど、どうすればいいの?」と悩んでいる方も、この記事を読めばきっとすっきりしますよ!
それでは、さっそく可変長引数の世界に入っていきましょう!
2. 可変長引数とは?|引数を自由な数だけ受け取れる仕組み
関数を定義するとき、ふつうはこんなふうに書きますよね。
def greet(name):
print(f"こんにちは、{name}さん!")
この場合、関数 greet() に渡せる引数は「1つだけ」。たとえばこうです。
greet("鈴木") # → こんにちは、鈴木さん!
でも、もし「複数の人にあいさつしたい」と思ったらどうでしょう?greet("鈴木", "田中", "佐藤") のように複数の名前を渡したいのに、引数が1つしか定義されていないとエラーになってしまいます。
ここで登場するのが 可変長引数 です!
🔄 可変長引数ってなに?
引数の数を自由に変えて関数に渡せる仕組みのことです。
Pythonでは、次の2つの方法で可変長引数を扱えます。
| 種類 | 説明 | 書き方 |
|---|---|---|
*args | 複数の「位置引数」をまとめて受け取る | def func(*args): |
**kwargs | 複数の「キーワード引数」をまとめて受け取る | def func(**kwargs): |
これらを使えば、こんなふうに関数の引数を自由に扱えるようになります。
🌟 実際にどんなときに使うの?
- 引数の数が決まっていない関数を作りたいとき
- 「オプション引数」を複数渡せるようにしたいとき
- 外部のライブラリなどで柔軟な関数を定義したいとき

Pythonの標準関数でもよく使われていて、有名な print() 関数も実は *args を使っているんです!
3. *args の使い方|位置引数をまとめて受け取ろう
まずは、位置引数をまとめて受け取る方法から紹介します。Pythonでは、関数の引数に * をつけることで、渡された引数を1つのタプル(順番付きの集合)として受け取ることができます。
これが、*args の正体です!
🧪 基本の書き方
def show_numbers(*args):
print(args)
この関数をいろんな形で呼び出してみましょう。
show_numbers(1)
# → (1,)
show_numbers(1, 2, 3)
# → (1, 2, 3)
show_numbers()
# → ()
💡 args には、渡された引数が タプルの形 でまとめて入っています。引数がなければ空のタプルになります。
🎯 取り出して使ってみよう
def add_numbers(*args):
total = 0
for num in args:
total += num
print(f"合計は {total} です")
add_numbers(5, 10, 20)
# → 合計は 35 です
このように、*args はループ処理と相性がよく、**「何個くるか分からない数値を全部合計する」**といった場面でとても便利です。
🧑🤝🧑 他の引数と一緒に使うときは?
def greet_people(*args, ending="さん"):
for name in args:
print(f"{name}{ending}")
greet_people("鈴木", "田中", ending="くん")
# → 鈴木くん
# → 田中くん
*argsは「位置引数」ending="さん"は「キーワード引数(デフォルト値あり)」
このように、*args の後ろに通常の引数(キーワード指定)を書くこともできます。
ただし、関数を呼び出すときはキーワードで渡す必要があるので注意です。
💬 実は身近に使ってる?print()関数も *args
print("Python", "は", "楽しい", "!")
# → Python は 楽しい !

このように、print()関数は何個でも引数を受け取れる関数です。実は裏で *args が使われています。
意識せずに可変長引数を使っていたんですね!
4. **kwargs の使い方|キーワード引数を辞書で受け取ろう
次に紹介するのは、キーワード引数をまとめて受け取る方法です。こちらでは **kwargs(ダブルアスタリスク+名前)を使います。
*args が「位置引数をタプルで受け取る」のに対して、**kwargs は「キーワード付きの引数を辞書で受け取る」ものです。
🧪 基本の書き方
def show_info(**kwargs):
print(kwargs)
この関数にキーワード引数を渡してみましょう。
show_info(name="田中", age=20)
# → {'name': '田中', 'age': 20}
💡 kwargs には、渡されたキーワード引数が 辞書(dict)として格納されるんです!
🔎 中身を取り出して使ってみよう
def show_profile(**kwargs):
for key, value in kwargs.items():
print(f"{key}:{value}")
show_profile(name="鈴木", job="エンジニア")
# → name:鈴木
# → job:エンジニア
このように、**kwargs を使えば、引数の数がバラバラでも柔軟に情報を処理することができます。
🧑🔧 通常の引数と組み合わせて使う
def greet_user(id, **kwargs):
print(f"ユーザーID: {id}")
for key, value in kwargs.items():
print(f"{key}: {value}")
greet_user(101, name="佐藤", status="ログイン中")
# → ユーザーID: 101
# → name: 佐藤
# → status: ログイン中
ポイントは、通常の引数は前に、**kwargs は後に書くというルールです。
呼び出し側では、通常の引数はそのまま、キーワード引数は名前を指定して渡すのが基本になります。
💡 **kwargs が活躍するシーン
- 設定オプションをまとめて渡したいとき
- UIやAPIなどで「あるかもしれない引数」に対応したいとき
- 不要な引数を無視する処理を書きたいとき(汎用性のある関数を作りたい)
5. *argsと**kwargsを同時に使うときの注意点
ここまでで、
*args→ 複数の位置引数を受け取る**kwargs→ 複数のキーワード引数を受け取る
という2つの便利な仕組みを見てきましたね。
実はこの2つ、同じ関数の中で一緒に使うこともできます!
でも、ちょっとだけ書き方にルールがあるので注意が必要です。
🧪 書く順番にルールがある!
Pythonの関数定義では、次の順番で引数を書くのがルールです👇
def 関数名(通常の引数, *args, キーワード専用引数, **kwargs):
# 処理
❗間違った順番で書くとエラーになります。以下のように書くのが正解です:
def example(a, b=0, *args, c=10, **kwargs):
print(a, b, args, c, kwargs)
この関数は次のように呼び出せます:
example(1, 2, 3, 4, 5, c=99, d=100, e=200)
# → 1 2 (3, 4, 5) 99 {'d': 100, 'e': 200}
✅ 全体の流れを整理すると…
| 引数の種類 | どう扱われるか |
|---|---|
| 通常の引数 | 位置引数として必ず渡す |
*args | 位置引数をまとめてタプルに |
キーワード専用引数(例:c=10) | キーワード指定でしか渡せない |
**kwargs | キーワード引数をまとめて辞書に |
💡 どんなときに両方使う?
両方使うと、こんな風にとても柔軟な関数が作れます:
def process_request(user_id, *args, debug=False, **kwargs):
print(f"ID: {user_id}")
print(f"追加データ: {args}")
print(f"デバッグモード: {debug}")
print(f"オプション: {kwargs}")
process_request(
123,
"itemA", "itemB",
debug=True,
timeout=30,
retries=3
)
出力:
ID: 123
追加データ: ('itemA', 'itemB')
デバッグモード: True
オプション: {'timeout': 30, 'retries': 3}

このように、*args と **kwargs を組み合わせることで、拡張性が高く、メンテナンスしやすい関数が作れます!
6. 実践ミニコード例|*argsと**kwargsで柔軟な関数を作ってみよう!
ここからは、*args と **kwargs を実際に使った「ちょっとした便利な関数」を作って、可変長引数の使い方を実践的に身につけていきましょう!
🧮 例①:いくつでも合計できる sum_all() 関数
def sum_all(*args):
total = sum(args)
print(f"合計は {total} です")
sum_all(10, 20, 30)
# → 合計は 60 です
sum_all(1, 2)
# → 合計は 3 です
💡 *args で渡された数値を sum() にそのまま渡すだけでOK!
引数の数がいくつでも動いてくれる、便利な関数になります。
📄 例②:プロフィール表示関数 show_profile()
def show_profile(name, age, **kwargs):
print(f"名前: {name}")
print(f"年齢: {age}")
for key, value in kwargs.items():
print(f"{key}: {value}")
show_profile("鈴木", 28, job="エンジニア", hobby="読書")
# → 名前: 鈴木
# → 年齢: 28
# → job: エンジニア
# → hobby: 読書
💡 **kwargs によって、追加情報(オプション)をいくつでも渡せるようになっています。まるで「設定項目が自由なプロフィール機能」のようですね!
📦 例③:ログ出力関数 custom_log()
def custom_log(*args, **kwargs):
sep = kwargs.get("sep", " ")
end = kwargs.get("end", "\n")
print(*args, sep=sep, end=end)
custom_log("ログ:", "エラーが発生しました", sep="|", end="!!!\n")
# → ログ:|エラーが発生しました!!!
💡 Pythonの print() と同じように、出力の仕方をカスタマイズできます!*args で複数の出力内容を受け取り、**kwargs で細かい設定(区切りや末尾)を受け取っています。
🤖 実務でもよく使うパターン
たとえば、APIやライブラリ、GUIアプリなどでは、
- 「使う人がどんな引数を渡すか分からない」
- 「柔軟に対応したい」
という場面がとても多くあります。

そんなときに *args や **kwargs を使っておけば、エラーにならずに追加引数を処理できるので、安心です。
7. まとめ|*args **kwargsを使いこなして、関数をもっと自由に!
ここまで、Pythonの可変長引数である *args と **kwargs の使い方をじっくり見てきました。
ポイントをふり返りながら、「どんなときに使うのか?」をもう一度整理しておきましょう。
✅ *args のポイント(位置引数をまとめて受け取る)
- アスタリスク1つ
*をつける - 関数内では タプル として扱われる
- どんな数の引数でも受け取れる
- よくある使い道:
- 数値の合計
- 複数の値を一括処理する関数
print()のような出力関数の実装
✅ **kwargs のポイント(キーワード引数をまとめて受け取る)
- アスタリスク2つ
**をつける - 関数内では 辞書 として扱われる
- 名前付きで、自由な数の引数を受け取れる
- よくある使い道:
- オプション設定を柔軟に受け取る
- ログ関数やAPIリクエスト処理などの引数処理
- 将来的に引数が増えるかもしれない関数の保守性向上
🧠 *argsと**kwargsを同時に使うと?
- 書き順に注意!(順番:通常引数 →
*args→ キーワード専用引数 →**kwargs) - 両方使うことで、どんな呼び出し方にも柔軟に対応できる関数が作れる
- 実務やライブラリ開発でよく使われるテクニック
Pythonの関数は、基本のままでも十分に便利ですが、*args や **kwargs を取り入れると、ぐんと拡張性がアップします。
「同じような関数をいくつも作るのが面倒…」というときも、可変長引数を使えば1つの関数で柔軟に対応できるかもしれません。

最初は「見慣れない書き方かも…?」と感じるかもしれませんが、今回のような実例と一緒に少しずつ触れていくことで、きっと自然に使いこなせるようになりますよ!
あわせて読みたい|関数・引数まわりの理解をさらに深めたい方へ
*args や **kwargs を学んだ今、次は以下の記事を読むことで関数まわりの理解がさらに深まります!
初心者さんにもやさしい内容ばかりなので、ぜひ参考にしてみてくださいね。
🔗 Python初心者向け|関数の基本の書き方を解説!
関数ってどうやって書くの?引数や戻り値って何?という基本をしっかり押さえたい方にぴったり!
🔗 【Python入門】lambda(ラムダ式)の使い方をわかりやすく解説
関数をその場で使い切りたいときに便利な「無名関数」=lambda式も、一緒に覚えておくと便利!
🔗 Pythonエラーが怖くなくなる!初心者向けエラーメッセージの読み方講座
エラーに出会っても大丈夫!メッセージの読み方が分かれば、すぐに原因が見えてきます。
🔗 【Python入門】インデントルール完全ガイド|スペースとタブの違いって?
関数定義では特にインデントが命!ミスしやすい部分をあらかじめチェックしておきましょう。
よくある質問(Q&A)
- Q
*argsと**kwargsの両方を使うとき、引数の順番ってどう決めればいいの? - A
✅ 順番にはルールがあります!
def 関数名(通常の引数, *args, キーワード専用引数, **kwargs):- 位置引数(通常の引数)
- →
*args - → キーワード専用引数(デフォルト付きなど)
- →
**kwargs
この順番を守らないと、SyntaxError が出るので注意しましょう!
- Q
argsやkwargsじゃない名前を使っても大丈夫? - A
✅ OKです!
*argsや**kwargsはあくまで「慣例的な名前」であり、好きな名前を使っても問題ありません。def sample(*values, **options):
print(values)
print(options)ただし、他の人が読んでもわかりやすいように、
args・kwargsを使うのが無難です。
- Q
*argsにキーワード引数を渡したらどうなるの? - A
✅ エラーになります。
*argsは位置引数(名前なし)しか受け取れません。
キーワード引数(例:name="田中")は**kwargsで受け取りましょう。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。