デフォルト引数
毎回 3000 と書くのが面倒で、しかも書き間違える
おこづかい帳の予算は、ふだんは 3000 円で固定です。それでも呼び出すたびに 3000 と書くのは面倒ですし、あるとき 300 と打ち間違えても誰も教えてくれません。
こういうときは、引数に 既定値 を持たせます。渡さなかったときに使われる値をあらかじめ決めておく仕組みで、デフォルト引数と呼びます。書き方は、引数名のうしろに = と値を書くだけです。
Python
def yen(price, unit="円"):
return str(price) + unit
print(yen(120))
print(yen(120, "pt"))120円 と 120pt が出ます。渡さなければ既定値の "円" が使われ、渡せばそちらが優先されます。よく使う値を既定値にしておくと呼び出し側が短くなり、短いコードはそれだけで間違いが減ります。
既定値のある引数は後ろにまとめる
既定値のない引数より前に、既定値のある引数を置くことはできません。
Python
def bad(unit="円", price):
return str(price) + unitこれは実行する前に SyntaxError になり、non-default argument follows default argument と出ます。値は前から順に詰まっていくので、途中だけ飛ばすことができないためです。
既定値は、関数を定義したときに 1 回だけ作られ、その後ずっと使い回されます。数値や文字列なら問題になりませんが、リストや辞書を既定値にすると、前の呼び出しで足した中身が次の呼び出しにも残ります。原因の分からないバグで丸一日溶かす、実務でも定番の事故です。
ちょうど予算どおりは、オーバーか
境目の扱いは、書き始める前に自分で決めて書き残します。決めていないと、テストを書くたびに答えが揺れます。
比較の結果はそのまま True か False になるので、if で分岐しなくても、比較の式そのものを返せます。
Python
print(3500 > 3000)
print(3000 > 3000)
print(3000 >= 3000)True False True の順に出ます。> と >= のどちらを選ぶかで、ちょうどの値の扱いが真逆になります。
やってみよう
関数 check_over(total, budget=3000) を実装してください。合計金額 total が予算 budget を 超えていたら True、そうでなければ False を返します。budget の既定値は 3000 です。
total と budget がちょうど同じときは False です。手元では check_over(2500) と check_over(3500) と check_over(1000, 500) の 3 つを試して、既定値が使われる場合と上書きされる場合の違いを見てください。
要件
- 関数名は check_over で、引数は total と budget の 2 つ
- budget の既定値は 3000 にする
- total が budget を超えていたら True、そうでなければ False を返す
- total と budget が同じ値のときは False を返す
入出力例
check_over(2500) → false
check_over(3500) → true
check_over(3000) → false
check_over(3500, 4000) → false
check_over(0) → false