コース一覧
    Pythonクラス・総合制作
    月次レポートv2

    Pythonクラス・総合制作

    クラスと総合制作を学び、Pythonの知識を組み合わせた小さなプログラムを完成できるようにします。

    1
    クラス入門
    01. クラス定義15分
    02. __init__とインスタンス変数15分
    03. メソッド15分
    04. __str__15分
    05. クラス変数15分
    06. dataclass15分
    07. オブジェクトと内包表記15分
    08. つくる クラスベース化20分
    09. 第7章クイズ10分
    2
    総合制作
    01. パッケージ構成に整理20分
    02. 月次レポートv220分
    03. 動作チェックスクリプト20分
    04. 自由拡張20分
    05. 完成と次のステップ10分

    月次レポートv2

    このレッスンでできるようになること

    その月の合計、前の月との差、カテゴリ別の内訳をまとめて返す月次レポートを、中級の道具だけで組み立てられるようになります。

    レポートは3つの部品でできています

    入門で作った家計簿のレポートは、合計を出して終わりでした。v2では次の3つを出します。

    • その月の合計金額
    • 前の月と比べていくら増えたか減ったか
    • カテゴリ別の内訳を、金額の大きい順に

    どれも第3章と第4章でやったことの組み合わせです。新しい文法は出てきません。

    その月だけを取り出す

    日付を "2026-08-01" の形で持っておくと、月での絞り込みは文字列の先頭一致で書けます。

    Python

    this_month = [e for e in expenses if e["date"].startswith("2026-08")]

    startswith は「その文字列で始まるか」を返すメソッドです。第3章の条件付き内包表記に、そのまま条件として置けます。

    前の月を求める

    "2026-08" の前は "2026-07" です。ところが "2026-01" の前は "2025-12" で、年をまたぎます。ここは素直に数値に直して考えます。

    Python

    def previous_month(month):
        year, m = month.split("-")
        year, m = int(year), int(m)
        if m == 1:
            return f"{year - 1}-12"
        return f"{year}-{m - 1:02d}"

    {m - 1:02d} は「2桁の整数、足りない桁は0で埋める」という書き方です。7 が 07 になります。これを忘れると 2026-7 になり、startswith での比較が合わなくなります。

    増減は符号を自分で付けます

    差がプラスかマイナスかは、見た人にすぐ分かる形で出したいところです。

    Python

    diff = total - prev_total
    sign = "+" if diff >= 0 else "-"
    line = f"前月比 {sign}{abs(diff)}円"

    第3章の if-else 式が、こういう小さな分岐で効いてきます。abs は絶対値を返す組み込み関数で、これを挟むことで - が二重に付くのを防いでいます。

    内訳は Counter と sorted で

    カテゴリ別の集計は第2章の Counter、並べ替えは第4章の sorted と key です。金額の大きい順にしたいので、キーにマイナスを付けます。

    Python

    for category, amount in sorted(totals.items(), key=lambda kv: (-kv[1], kv[0])):
        print(f"{category} {amount}円")

    (-kv[1], kv[0]) はタプルのキーです。まず金額の降順で並び、金額が同じときはカテゴリ名の昇順で並びます。同額のときの順番を決めておかないと、実行するたびに並びが変わる可能性が残ります。レポートのように人が読むものは、いつ動かしても同じ順で出ることが大事です。

    戻り値は1行1要素の文字列のリストにしておきます。こうしておくと、画面に出すのもファイルに書くのも呼ぶ側の自由になります。

    要件

    1. previous_month(month) を書く。2026-08 なら 2026-07、2026-01 なら 2025-12 を返す
    2. 月は必ず2桁にする。2026-7 のような形にしない
    3. monthly_report(expenses, month) は行の文字列を並べたリストを返す
    4. 1行目は 2026-08 の合計 6130円 の形にする
    5. 2行目は 前月比 +1050円 の形にする。減っているときは 前月比 -300円 とする
    6. 3行目以降はその月のカテゴリ別合計を、金額の降順、同額ならカテゴリ名の昇順で 食費 4050円 の形で並べる
    7. 対象の月に支出が1件も無いときは、合計0円と前月比の2行だけを返す

    ヒント

    月での絞り込みは e["date"].startswith(month) が使えます

    2桁の月は f"{m:02d}" で作れます

    降順と昇順を混ぜた並べ替えは key=lambda kv: (-kv[1], kv[0]) です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 動作チェックスクリプト

      assert で主要機能の確認を自動化します。

    • 自由拡張

      検索や予算アラートなど、欲しい機能を1つ設計して足します。

    • 完成と次のステップ

      作ったものを振り返り、次に進む道を見通します。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • メソッドクラスに属する関数
    • 内包表記for と if を 1 行で書く構文
    • 関数処理に名前を付けて再利用できる単位
    • タプル順序付きで変更不可のシーケンス
    • 戻り値呼び出し元への返答を表す点線矢印
    • リスト順序付きで複数の値を扱うデータ構造
    main.py
    エディタを読み込んでいます

    メモ

    月次レポートv2

    ⌘S で保存