つくる:予算チェック
このレッスンで作るもの — 第 3 章の総仕上げとして、合計と予算を見比べて判定まで書き出す
check_budgetを作ります。
つくる — 予算チェック
第 2 章の終わりで、品名と金額を受け取ってレシートを返す make_receipt(name, price) ができました。ただ、あのレシートは「使った」ことを書き出すだけで、それが多いのか少ないのかは何も言ってくれません。
第 3 章で比較演算子と三項演算子を手に入れた今、そこに 判定 を足せます。作るのは check_budget(total, budget) です。合計と予算を受け取り、下記の 3 行を返します。
合計 3200円
予算 3000円
200円オーバー予算に収まっていれば、3 行目が変わります。
合計 2500円
予算 3000円
のこり 500円数字を並べるだけの出力と、「オーバー」の一言がある出力とでは、受け取る側の行動が変わります。判定を足すというのは、そういうことです。
組み立てを 2 段に分ける
3 行目だけが条件で変わり、1 行目と 2 行目はいつも同じ形です。そこで、変わるところだけを先に作ってから、最後に全体を組み立てます。
def check_budget(total, budget):
judge = f"{total - budget}円オーバー" if total > budget else f"のこり {budget - total}円"
return f"合計 {total}円\n予算 {budget}円\n{judge}"1 行目で三項演算子を使い、3 行目に入る文字列を judge という変数に作っています。2 行目で f-string に \n を混ぜて 3 行分を 1 本にまとめています。
judge という途中の変数を置いたのがポイントです。1 本の式に押し込むこともできますが、そうすると 1 行が長くなりすぎて読めません。
途中の結果に名前を付けると、式が短くなり、あとで見返したときに何をしているかが分かります。変数は値を保存するためだけの道具ではありません。
差の計算に注意する
オーバーしているときは total - budget、収まっているときは budget - total です。引く向きが逆 になります。
total = 3200、budget = 3000 なら、3200 - 3000 で 200 です。ここで budget - total と書くと -200 になり、-200円オーバー という妙な表示になります。
引き算の向きは、「どちらが大きいか分かっている側」から書く、と覚えると迷いません。total > budget が True の枝では total のほうが大きいので、total - budget です。
ちょうど予算どおりのとき
total と budget が同じ 3000 のときは、3000 > 3000 が False なので else の側に進み、のこり 0円 になります。
0円オーバー ではありません。使い切ったが超えてはいない、という扱いです。この境目の決め方は最初のレッスンから一貫させています。
手元で動かしてみる
kakeibo.py に下記を書き足して動かしてみてください。第 2 章までの make_receipt と並べると、アプリらしくなってきます。
def check_budget(total, budget):
judge = f"{total - budget}円オーバー" if total > budget else f"のこり {budget - total}円"
return f"合計 {total}円\n予算 {budget}円\n{judge}"
print(check_budget(3200, 3000))
print()
print(check_budget(2500, 3000))print() を引数なしで呼ぶと空行が 1 つ出ます。2 つの結果の区切りに使えます。\n が本物の改行として展開され、それぞれ 3 行ずつ表示されるはずです。
よくある間違い
- 末尾に
\nを付けてしまう — 3 行目のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間の 2 か所だけです。 - 引き算の向きを間違える — マイナス付きの数字が出たら、この間違いです。どちらの枝にいるかを確認してください。
- f-string の
fを書き忘れる —"合計 {total}円"と書くと、{total}が中身に置き換わらず、そのまま文字として出ます。
第 4 章で
if文を覚えたら、この関数を書き直してみてください。三項演算子が 1 行で済ませていたところを、ifとelseのブロックに開くと、あとから条件を 3 つ以上に増やせるようになります。同じ動きのコードを別の書き方で書き直すのは、上達のいちばんの近道です。
やってみよう
関数 check_budget(total, budget) を実装してください。下記の 3 行を \n でつないだ 1 本の文字列を返します。
1 行目は 合計 {total}円、2 行目は 予算 {budget}円、3 行目は判定です。total が budget を超えていれば {total - budget}円オーバー、そうでなければ のこり {budget - total}円 になります。末尾に改行は付けません。
要件
- 関数名は check_budget で、引数は total と budget の2つ
- 1行目は 合計 {total}円、2行目は 予算 {budget}円 とする
- 3行目は total が budget を超えていれば {total - budget}円オーバー、それ以外は のこり {budget - total}円 とする
- 行の区切りは \n を使い、末尾には改行を付けない
入出力例
check_budget(3200, 3000) → "合計 3200円
予算 3000円
200円オーバー"
check_budget(2500, 3000) → "合計 2500円
予算 3000円
のこり 500円"
check_budget(3000, 3000) → "合計 3000円
予算 3000円
のこり 0円"
check_budget(3001, 3000) → "合計 3001円
予算 3000円
1円オーバー"
check_budget(0, 3000) → "合計 0円
予算 3000円
のこり 3000円"
check_budget(120, 0) → "合計 120円
予算 0円
120円オーバー"