PR

基礎をつかんだら、Pythonの体系的な講座で一気に実力を伸ばすのも手です。

UdemyでPython講座を探す

アフィリエイト広告です。価格は変わりません。

🎯 最終演習

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は字下げでブロックを表すので、fordefの中は必ず半角スペース4つ下げます。次に多いのが辞書のキーの打ち間違いで、r["yen"]r["Yen"]と書くとKeyErrorになります。

この家計簿を自分用に作り替えたい

ぜひ書き換えてください。kakeiboのリストに自分の支出を入れ、print_report(kakeibo, 予算)の予算を変えるだけで自分用になります。カテゴリ名も自由です。手を入れて動かすところまでやると身につきます

🚩 次はこのカテゴリへ

Pythonで「作れる」感覚がつかめたら、次はブラウザで動くものを作ってみましょう。JavaScriptカテゴリの最終演習では、画面のボタンを押して動く電卓アプリを作ります。

JavaScriptのレッスンへ進む
広告スペース(バナー)
広告スペース(記事内)