デフォルト引数

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

このレッスンで分かること

  • def func(arg=値): で引数に初期値を持たせられます
  • デフォルト引数は 位置引数の後ろ に書く必要があります
  • 最小例は def greet(name, message="こんにちは"): return f"{message}、{name}さん"

デフォルト引数 とは

引数を省略したときに使われるデフォルト値を持つ関数を書きます。本レッスンでは、デフォルト引数 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

デフォルト引数

関数を作っていると「だいたい同じ値を渡すんだけど、たまに変えたい」という場面が出てきます。たとえば、Python で挨拶関数を書くとき、ほとんどのケースで「こんにちは」を使うけれど、夜だけは「こんばんは」にしたい、というような場面です。そんなときに便利なのが デフォルト引数 (default argument) です。引数に「もし指定がなかったらこの値を使ってね」という初期値を設定できます。

デフォルト引数は、関数を使う側の負担を減らすための仕組みです。よく使う値を初期値に設定しておけば、毎回同じ引数を書かずに済みます。

文法

デフォルト値は def func(arg=値): のように、引数名の後ろに = で繋いで書きます。

Python

def greet(name, message="こんにちは"): return f"{message}{name}さん" print(greet("太郎")) print(greet("花子", "おはよう"))

1 回目の呼び出しでは message を省略しているので、デフォルト値の "こんにちは" が使われます。2 回目は "おはよう" を明示的に渡しているので、そちらが優先されます。

引数の並び順のルール

デフォルト値を持つ引数は、必ずデフォルト値のない引数の後ろに置く必要があります。

Python

def ok(a, b=10): return a + b def ng(a=10, b): return a + b

ng の方は SyntaxError になります。Python のルールとして、デフォルト引数 は後ろにまとめて並べる、と覚えておきましょう。

「位置引数 (positional)」は前、「デフォルト引数」は後ろ。この順序は変えられません。

動きを追ってみる

デフォルト引数がどう解決されるか、フローで見てみます。

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. 関数を呼び出す
  2. 呼び出し時に値が渡されたかを確認する
  3. 渡されていれば、その値を使う
  4. 渡されていなければ、定義時のデフォルト値を使う
  5. 関数本体を実行する

呼び出し側で値を渡したかどうかで、使われる値が決まります。関数を定義したときの =値 がそのまま予備のバッテリーのように働きます。

実例

税率を引数に取る関数を考えてみましょう。日本では 10 パーセントが標準なので、それをデフォルトにしておきます。

Python

def add_tax(price, rate=0.1): return int(price * (1 + rate)) print(add_tax(1000)) print(add_tax(1000, 0.08))

このように書いておけば、軽減税率8 パーセントが必要なときだけ第 2 引数を渡せば良くなります。読みやすさと柔軟さが両立します。

よくある間違い

つまずきやすいポイントを 3 つ紹介します。

  • デフォルト値を持つ引数を前に置いてしまい SyntaxError になる
  • デフォルト値に リスト 辞書 などのミュータブル (mutable) オブジェクトを使ってしまう
  • デフォルト値が「呼び出すたびに評価される」と勘違いする

2 つ目は特に厄介な落とし穴です。

Python

def bad(items=[]): items.append(1) return items print(bad()) print(bad())

2 回目の呼び出しでは [1, 1] が返ってきます。デフォルトの空リストが関数定義時に 1 度だけ作られ、それを使い回しているからです。空のリストや辞書をデフォルトにしたい場合は、次のように書きましょう。

Python

def good(items=None): if items is None: items = [] items.append(1) return items

ミュータブルなデフォルト引数は Python の有名な落とし穴です。None を初期値にして、関数の中で [] を作るのが定石です。

デフォルト引数の使いどころ

設計面で覚えておきたいのは、デフォルト引数は「8 割の利用シーン」を埋めるためのものだ、ということです。requests ライブラリで timeout=30 のように初期値が用意されているのは、大半のリクエストで 30 秒で十分だからです。レアケースだけ呼び出し側で上書きできるようにしておくと、ライブラリが使いやすくなります。

「初期値で済むケースが多い」「明示しなくても意味が通じる」引数こそ、デフォルト値を持たせるべき引数です。

また、デフォルト引数を増やしすぎると関数のシグネチャが読みにくくなります。4 つも 5 つも初期値を持つ関数は、設計を見直すサインかもしれません。データクラス (dataclass) や 辞書 を引数に取る形にリファクタリングを検討しましょう。

この章のポイント

ここまでの要点 def f(a, b=10): のように後ろの引数だけにデフォルト値を持たせる。ミュータブルなデフォルト (空リスト・空辞書) は使わず、None を初期値にして関数内で生成する。

やってみよう

それでは、整数 n を受け取って、nadd を足した値を返す関数 add_value を書いてみましょう。add は省略可能で、省略した場合は 10 を加算します。add を明示的に渡したときはその値を加算します。return で値を返してください。def add_value(n, add=10): のシグネチャから始めると素直に書けます。

よくある質問

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

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

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

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

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

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

次のレッスン

次は キーワード引数 で、引数を省略したときに使われるデフォルト値を持つ関数を書きます を学びます。

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

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

理解度チェック (30 秒)

Q. デフォルト引数 とは何か、1 文で説明してください。

この章のポイント

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

関連レッスン

要件

  1. add_value 関数を定義する
  2. 第2引数 add のデフォルト値を 10 にする
  3. n + add の結果を return する

入出力例

test-cases.txt

add_value(5)15 add_value(5, 3)8 add_value(0)10 add_value(-7)3

ヒント

main.py
main.py
学習モード

メモ

デフォルト引数

⌘S で保存