つくる:関数に分割
文字列で返すと、表示を変えるたびに中を直すことになる
第 1 章から第 5 章までに、おこづかい帳の部品はもう出そろっています。レシートの 1 行を作る関数、予算と比べる関数、品名からカテゴリを決める関数、記録を一覧にする関数。この章で学んだのは、それらを役割ごとにきちんと分けるための道具でした。
仕上げに作るのは、記録の一覧と予算を受け取って、知りたい数字をまとめて返す関数です。ここで返すのは文字列ではなく 辞書 にします。
理由は、受け取った側が好きな形に組み立て直せるからです。文字列で返してしまうと、画面の表示を変えたいときに関数の中の計算まで直しに行くことになります。数字を出す関数と、それを文にする関数は分けておきます。
キーは 4 つで固定
辞書は中かっこで作り、キーと値を組にして並べます。
Python
def measure(text):
return {"length": len(text), "empty": text == ""}
print(measure("りんご"))
print(measure("")["empty"]){'length': 3, 'empty': False} と True が出ます。作るときは中かっこ、取り出すときは角かっこにキーの名前です。値には数値でも文字列でも真偽値でも入れられます。
今回のキーは count total remaining over の 4 つで固定です。1 つでも綴りが違うと、受け取る側が取り出せません。残額は budget - total で、使いすぎたときは負の数になります。-500 という値がそのまま「500 円の使いすぎ」を表すので、これで困りません。
over には True か False の真偽値を入れます。"オーバー" のような文字列ではありません。判定結果は真偽値で返し、言葉にするのは表示側の仕事です。ちょうど予算どおりのときを False にするのは check_over で決めた仕様と同じで、章をまたいで判定がぶれないようにしています。
1 つの関数が短く、名前を見れば役割が分かる。この状態を保てているうちは、機能をいくつ足しても手に負えなくなりません。
0 件でも自然に正しい答えが出るか
記録が 0 件のとき、for は 1 度も回らないので合計は初期値の 0 のままです。件数も 0、残額は予算そのもの、over は False になります。
つまり空のときのための場合分けを書かなくても、正しい答えが出ます。書き終わったら空のリストを渡してみて、特別扱いなしで通るか を必ず確かめてください。ここで場合分けが要るなら、どこかの初期値が間違っています。
合計を作る前に入れ物を 0 で用意するのを忘れると NameError です。章が変わっても、この手順は変わりません。
やってみよう
関数 summarize(records, budget) を実装してください。支出のリスト records と予算 budget を受け取り、下記の 4 つのキーを持つ辞書を return します。
count は件数、total は金額の合計、remaining は budget - total、over は合計が予算を超えていれば True、そうでなければ False です。
records が空のリストのときは、count と total が 0、remaining が budget の値、over が False になります。
要件
- 関数名は summarize で、引数は records と budget の 2 つ
- 戻り値は count / total / remaining / over の 4 つのキーを持つ辞書
- remaining は budget - total で、負の数になってよい
- over は total > budget の結果の True か False にする