つくる:何件でも記録
決め打ちの 2 行から抜け出す
第 1 章のレシートは 2 行が決め打ちでした。第 2 章で品名と金額を受け取れるようになりましたが、それでも 1 件だけです。ループを覚えたので、いよいよ 件数の縛りを外します。
作るのは、記録の集まりを受け取り、番号付きの一覧と合計を 1 本の文字列にして返す関数です。「何件でも」は、アプリが道具になるための最低条件です。ここを越えると、おこづかい帳として実際に使えるものになります。
1 件は 3 つの値の組
支出 1 件は、下記のような 辞書 で表します。
Python
record = {"name": "りんご", "price": 120, "category": "食費"}
print(record["name"])
print(record["price"])りんご と 120 が出ます。品名が name、金額が price、カテゴリが category で、取り出すときは角かっこにキーの名前を書きます。いまは、このキー指定の取り出し方だけ使えれば十分です。
記録の集まりは、この辞書を並べたリストです。for で 1 件ずつ取り出すと、変数に辞書が 1 つ入ります。番号も欲しいなら enumerate、合計も欲しいなら同じループの中で足し上げます。一覧と合計のために 2 回まわす必要はありません。
金額は数値なので、行に混ぜるときは str を挟みます。品名とカテゴリは最初から文字列なので、そのままつなげます。
0 件のときに何を出すか
出力の形は下記のとおりです。
プレーンテキスト
=== おこづかい帳 ===
1. りんご 120円 (食費)
2. パン 250円 (食費)
合計 370円見出しが 1 行、記録が件数分、最後に合計が 1 行です。番号は 1 から始まり、金額のうしろに半角かっこでカテゴリを添えます。末尾に改行は付けません。
記録が 1 件もないときは、代わりに 記録がありません の 1 行を入れ、合計は 合計 0円 にします。0 件でもループは静かに 0 周で終わるためエラーは出ず、行が抜けたまま気づかない、というのがありがちです。
空のときに何を出すかを決めておくのは、地味ですが大事な設計です。決めていないと、見出しと合計だけの不思議な画面が出ます。
やってみよう
関数 show_all(records) を実装してください。引数 records は、name と price と category をキーに持つ辞書が並んだリストです。
1 行目は === おこづかい帳 ===、続けて 1. りんご 120円 (食費) の形で記録を件数分、最後に 合計 370円 の形で合計を出します。改行 \n でつなぎ、末尾に改行は付けません。
records が空のリストのときは、見出しの次に 記録がありません を入れ、合計は 合計 0円 にします。かっこは半角、円 は全角です。区切りの半角スペースの数もテストと一致させます。
要件
- 関数名は show_all で、引数はリスト records の1つだけにする
- 1行目は "= おこづかい帳 ="、記録行は "1. りんご 120円 (食費)" の形にして 1 から番号を振る
- 最後の行は "合計 370円" の形で、全記録の price を足した合計を出す
- records が空のときは見出しの次に "記録がありません" を入れ、合計は 0円 にする
- 行の区切りは \n を使い、末尾には改行を付けない