Pythonで家計簿アプリを作ってみよう(総合演習)
ここまでの Python レッスンで学んだことを全部つないで、動く家計簿アプリを1つ完成させます。新しい構文は出てきません。リスト・辞書・for文・関数・f文字列——すでに練習したものだけで作れます。
1ステップずつ進むので、途中で止めてもそこまでの分は動きます。各ステップの「実行する」ボタンはブラウザの中でPythonを動かしているので、コードを書き換えて試すこともできます。
完成イメージ
最後まで進むと、こう表示されるところまで作ります。下の実行結果は、このページを作るときに実際にコードを走らせて得たものです。
===== 8月の家計簿 =====
1日 3,200円 スーパー
3日 480円 電車
5日 850円 コンビニ
8日 1,800円 映画
12日 4,100円 スーパー
15日 220円 バス
20日 2,400円 書籍
--------------------------
8,150円 食費
4,200円 娯楽費
700円 交通費
--------------------------
13,050円 合計
15,000円 予算
予算内です。あと 1,950円 使えます。
STEP 1支出を1件ずつ書き出す
🎯 このステップのゴール: 家計簿のデータを「辞書のリスト」で表す
まずはデータの形を決めます。家計簿の1行は「日付・品目・分類・金額」の4つの情報を持ちます。こういう「名前の付いた値の組」は辞書で表すのがPythonの定石です。
そして1か月分は何行もあるので、辞書をリストに並べます。この「辞書のリスト」という形は、家計簿に限らず表形式のデータを扱うときの基本形です。CSVを読み込んでも、データベースから取り出しても、Pythonではだいたいこの形になります。
ここではlen()で件数を数えて、正しく作れたか確かめます。
記録した件数: 7件
1件目: {'day': 1, 'item': 'スーパー', 'category': '食費', 'yen': 3200}
STEP 2合計金額を計算する
🎯 このステップのゴール: for文で全件を足し合わせ、関数にまとめる
次は合計金額です。リストをforで1件ずつ取り出し、r["yen"]で金額だけを取り出して足していきます。
ここで大事なのが関数にまとめることです。total_yen(records)という名前を付けておけば、あとから何度でも呼べます。「合計を出す」という仕事に名前を付ける——これが関数を作る一番の理由です。
合計する前にtotal = 0と入れ物を用意しておくのを忘れないでください。ここを飛ばすと「変数が無い」というエラーになります。
合計: 13050円
STEP 3カテゴリごとに集計する
🎯 このステップのゴール: 辞書をカウンタとして使い、分類別の合計を出す
「何にいくら使ったか」を知りたいので、カテゴリごとに合計します。ここでも辞書を使いますが、今度は集計の入れ物としてです。
やり方は決まっています。そのカテゴリが辞書にもうあれば足す、無ければ新しく作る——これだけです。if cat in sums:で確かめて、elseで初回を作ります。
この「辞書をカウンタとして使う」書き方は、単語の出現回数を数えるときも、アクセスログを集計するときも、まったく同じ形で使えます。覚えておくと一生使えるパターンです。
食費: 8150円 交通費: 700円 娯楽費: 4200円
STEP 4使った順に並べ替える
🎯 このステップのゴール: sorted の key に関数を渡して、金額の大きい順にする
集計はできましたが、順番がバラバラです。使った金額が多い順に並べると、どこにお金がかかっているか一目で分かります。
sorted()にkeyを渡すのがポイントです。key=lambda pair: pair[1]は「各要素の2番目(金額)を見て並べてくれ」という指示です。reverse=Trueを付ければ大きい順になります。
関数を引数として渡していることに注目してください。高階関数のレッスンで練習したことが、ここで実際に役立ちます。並べ替えの基準を自分で決められるので、pair[0]に変えればカテゴリ名の順にもできます。
食費: 8150円 娯楽費: 4200円 交通費: 700円
STEP 5レシート風に桁を揃える
🎯 このステップのゴール: f文字列の書式指定で、金額を右揃え・カンマ区切りにする
数字がバラバラの位置にあると読みにくいので、レシートのように桁を揃えます。f文字列にはそのための書式指定があります。
{r['yen']:>7,}という書き方を分解すると、>が右揃え、7が幅7文字、,が3桁ごとのカンマです。{r['day']:>2}も同じ仕組みで、1桁の日付の前に空白を1つ入れて2桁に揃えています。
ここで品目を行の最後に置いているのには理由があります。日本語は表示幅が半角の2倍なのに、書式指定は「文字数」で数えるからです。{r['item']:<8}と書くと、「スーパー」(4文字)には空白が4つ、「電車」(2文字)には6つ入ります。文字数は揃っても見た目の幅は揃いません。日本語を含む表を整形するときに必ず当たる話で、幅の変わるものは行の最後に置くのが一番簡単な回避策です。
print("-" * 26)という書き方も使っています。文字列に数を掛けると繰り返されるので、区切り線を引くのに便利です。
===== 8月の家計簿 ===== 1日 3,200円 スーパー 3日 480円 電車 5日 850円 コンビニ 8日 1,800円 映画 12日 4,100円 スーパー 15日 220円 バス 20日 2,400円 書籍 --------------------------
STEP 6予算と比べて仕上げる
🎯 このステップのゴール: すべてを1つの関数にまとめ、予算オーバーを判定する
最後の仕上げです。ここまでに作った部品をprint_report()という1つの関数にまとめます。そして予算と比べて、残りいくら使えるかを表示します。
判定はif nokori >= 0:だけです。足りていれば残額、超えていれば超過額を出します。超過額は-nokoriと符号を反転させれば正の数で表示できます。
これで完成です。print_report(kakeibo, 15000)の15000を書き換えれば、別の予算でもすぐ試せます。関数に切り出しておくと、あとから条件を変えるのが一瞬になる——これが関数の効き目です。
データの行を増やしたり、カテゴリを追加したりしても、そのまま動きます。ぜひ書き換えて確かめてみてください。
===== 8月の家計簿 =====
1日 3,200円 スーパー
3日 480円 電車
5日 850円 コンビニ
8日 1,800円 映画
12日 4,100円 スーパー
15日 220円 バス
20日 2,400円 書籍
--------------------------
8,150円 食費
4,200円 娯楽費
700円 交通費
--------------------------
13,050円 合計
15,000円 予算
予算内です。あと 1,950円 使えます。
よくある質問
家計簿のデータをファイルに保存するには?
このページではファイル操作を使っていませんが、Pythonカテゴリにはファイル操作の基本のレッスンがあります。open()で書き出せば、次に起動したときも記録が残ります。まずはこのページの形を動かしてから進むのがおすすめです。
エラーが出て動きません
よくあるのはインデント(字下げ)のずれです。Pythonは字下げでブロックを表すので、forやdefの中は必ず半角スペース4つ下げます。次に多いのが辞書のキーの打ち間違いで、r["yen"]をr["Yen"]と書くとKeyErrorになります。
この家計簿を自分用に作り替えたい
ぜひ書き換えてください。kakeiboのリストに自分の支出を入れ、print_report(kakeibo, 予算)の予算を変えるだけで自分用になります。カテゴリ名も自由です。手を入れて動かすところまでやると身につきます。
🚩 次はこのカテゴリへ
Pythonで「作れる」感覚がつかめたら、次はブラウザで動くものを作ってみましょう。JavaScriptカテゴリの最終演習では、画面のボタンを押して動く電卓アプリを作ります。
JavaScriptのレッスンへ進む