つくる:予算チェック
1 行が長くなりすぎて、どこを直せばいいか分からない
第 3 章の総仕上げとして、合計と予算を見比べて判定まで書き出す check_budget を作ります。返すのは 3 行です。
Python
合計 3200円
予算 3000円
200円オーバー予算に収まっていれば、3 行目が のこり 500円 に変わります。数字を並べるだけの出力と、「オーバー」の一言がある出力とでは、受け取る側の行動が変わります。判定を足すというのは、そういうことです。
問題は、条件で変わる部分を組み立ての式へ直接埋め込むと、1 行が長くなりすぎて読めなくなることです。
変わるところだけ、先に名前を付ける
3 行のうち変わるのは 3 行目だけで、1 行目と 2 行目はいつも同じ形です。そこで、変わるところを先に作って変数に入れてから、最後に全体を組み立てます。
Python
stock = 2
state = "残りわずか" if stock <= 3 else "十分あります"
print(f"在庫 {stock}個\n{state}")1 行目で条件によって変わる文字列を作って state に入れ、2 行目で全体をまとめています。1 本の式に押し込むこともできますが、そうすると横に長くなって目で追えません。途中の結果に名前を付けると式が短くなり、あとで見返したときに何をしているかも分かります。変数は、値を保存するためだけの道具ではありません。
引く向きを間違えない
超過額とのこりでは、引き算の向きが逆になります。オーバーしているときは合計のほうが大きく、収まっているときは予算のほうが大きいからです。
向きを取り違えると -200円オーバー のような妙な表示になります。エラーは出ません。引き算は その枝で大きいと分かっているほう から書く、と覚えると迷いません。マイナス付きの数字が出たら、自分がどちらの枝にいるかを確かめてください。
やってみよう
関数 check_budget を実装してください。引数は total と budget の 2 つで、下記の 3 行を \n でつないだ 1 本の文字列を返します。
1 行目は 合計 のあとに total と 円、2 行目は 予算 のあとに budget と 円、3 行目が判定です。total が budget を超えていれば超過額に 円オーバー を付け、そうでなければ のこり のあとに残額と 円 を書きます。末尾に改行は付けません。
check_budget(3200, 3000) なら上の 3 行、check_budget(2500, 3000) なら 3 行目が のこり 500円 です。ちょうど予算どおりの check_budget(3000, 3000) は、超えてはいないので 0円オーバー ではなく のこり 0円 になります。この境目の決め方は、第 3 章の最初から一貫させています。
要件
- 関数名は check_budget で、引数は total と budget の2つ
- 1行目は 合計 {total}円、2行目は 予算 {budget}円 とする
- 3行目は total が budget を超えていれば {total - budget}円オーバー、それ以外は のこり {budget - total}円 とする
- 行の区切りは \n を使い、末尾には改行を付けない