つくる:予算チェック

このレッスンで作るもの — 第 3 章の総仕上げとして、合計と予算を見比べて判定まで書き出す check_budget を作ります。

つくる — 予算チェック

第 2 章の終わりで、品名と金額を受け取ってレシートを返す make_receipt(name, price) ができました。ただ、あのレシートは「使った」ことを書き出すだけで、それが多いのか少ないのかは何も言ってくれません。

第 3 章で比較演算子と三項演算子を手に入れた今、そこに 判定 を足せます。作るのは check_budget(total, budget) です。合計と予算を受け取り、下記の 3 行を返します。

合計 3200予算 3000200円オーバー

予算に収まっていれば、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 = 3200budget = 3000 なら、3200 - 3000200 です。ここで budget - total と書くと -200 になり、-200円オーバー という妙な表示になります。

引き算の向きは、「どちらが大きいか分かっている側」から書く、と覚えると迷いません。total > budgetTrue の枝では total のほうが大きいので、total - budget です。

diagram (will load when visible)

ちょうど予算どおりのとき

totalbudget が同じ 3000 のときは、3000 > 3000False なので 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 行ずつ表示されるはずです。

よくある間違い

  1. 末尾に \n を付けてしまう — 3 行目のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間の 2 か所だけです。
  2. 引き算の向きを間違える — マイナス付きの数字が出たら、この間違いです。どちらの枝にいるかを確認してください。
  3. f-string の f を書き忘れる"合計 {total}円" と書くと、{total} が中身に置き換わらず、そのまま文字として出ます。

第 4 章で if 文を覚えたら、この関数を書き直してみてください。三項演算子が 1 行で済ませていたところを、ifelse のブロックに開くと、あとから条件を 3 つ以上に増やせるようになります。同じ動きのコードを別の書き方で書き直すのは、上達のいちばんの近道です。

やってみよう

関数 check_budget(total, budget) を実装してください。下記の 3 行を \n でつないだ 1 本の文字列を返します。

1 行目は 合計 {total}円、2 行目は 予算 {budget}円、3 行目は判定です。totalbudget を超えていれば {total - budget}円オーバー、そうでなければ のこり {budget - total}円 になります。末尾に改行は付けません。

要件

  1. 関数名は check_budget で、引数は total と budget の2つ
  2. 1行目は 合計 {total}円、2行目は 予算 {budget}円 とする
  3. 3行目は total が budget を超えていれば {total - budget}円オーバー、それ以外は のこり {budget - total}円 とする
  4. 行の区切りは \n を使い、末尾には改行を付けない

入出力例

check_budget(3200, 3000) → "合計 3200予算 3000200円オーバー" check_budget(2500, 3000) → "合計 2500予算 3000のこり 500円" check_budget(3000, 3000) → "合計 3000予算 3000のこり 0円" check_budget(3001, 3000) → "合計 3001予算 30001円オーバー" check_budget(0, 3000) → "合計 0予算 3000のこり 3000円" check_budget(120, 0) → "合計 120予算 0120円オーバー"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
main.py
学習モード

メモ

つくる:予算チェック

⌘S で保存