コース一覧
    Python内包表記・高階関数
    ジェネレータ式

    Python内包表記・高階関数

    内包表記と高階関数を学び、データ変換を簡潔かつ意図どおりに表現できるようにします。

    1
    内包表記
    01. リスト内包表記と条件15分
    02. if-else付き内包表記15分
    03. 辞書内包表記15分
    04. set内包表記15分
    05. ジェネレータ式15分
    06. つくる 集計のリファクタ20分
    07. 第3章クイズ10分
    2
    高階関数
    01. 関数はオブジェクト15分
    02. map15分
    03. filter15分
    04. sortedとkeyの応用15分
    05. reduce15分
    06. anyとall15分
    07. つくる 抽出・変換パイプライン20分
    08. 第4章クイズ10分

    ジェネレータ式

    このレッスンでできるようになること。ジェネレータ式で合計を求め、途中のリストを作らずに集計できるようになります。

    ここまでの3レッスンは、いずれも新しい入れ物を作る書き方でした。ところが合計を出したいだけのとき、金額を並べたリストは合計を出した瞬間に用がなくなります。

    Python

    total = sum([e["amount"] for e in expenses])

    この角かっこを外すと、ジェネレータ式になります。

    Python

    total = sum(e["amount"] for e in expenses)

    ジェネレータ式は、値を全部作ってから渡すのではなく、必要になったときに1件ずつ作って渡すしくみです。リストを丸ごとメモリに置かずに済むので、支出が何万件になっても使うメモリはほとんど増えません。関数の引数がジェネレータ式ひとつだけのときは、上のように丸かっこを省いて書けます。

    代わりに気をつける点があります。ジェネレータ式は1回しか読み取れません。変数に入れて sum を2回呼ぶと、2回目は0になります。また、len で件数を数えることもできません。中身を何度も使うなら、素直にリスト内包表記にしてください。

    Python

    gen = (e["amount"] for e in expenses)
    first = sum(gen)   # ここで中身を使い切る
    second = sum(gen)  # 0 になる

    合計以外にも、min や max、any や all といった「まとめて1つの答えを出す関数」とは相性がよく、同じ書き方がそのまま使えます。第4章の高階関数でも、この形は何度も出てきます。

    月別の辞書からカテゴリを絞って合計するときは、for を2つ並べて末尾に if を置きます。1行が長くなりすぎるようなら、途中で改行して読みやすく整えてください。

    要件

    1. 角かっこのリストを作らず、sum にジェネレータ式を渡すこと
    2. 全ての月を対象にし、指定カテゴリだけを合計すること
    3. 該当が無いときは 0 を返すこと

    ヒント

    sum の引数がジェネレータ式ひとつだけなら、丸かっこは省けます

    月ごとの支出リストは monthly.values() で取り出せます

    絞り込みの if は式の末尾に置きます

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

    関連レッスン

    • つくる 集計のリファクタ

      既存の集計ループ3つを内包表記に置き換えて、結果が変わらないことを確かめます。

    • 第3章クイズ

      内包表記の読み書きの理解を確認します。

    • 関数はオブジェクト

      関数を変数に入れて渡し、表示のしかたを差し替えます。

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

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

    • リスト順序付きで複数の値を扱うデータ構造
    • メモリプログラムとデータを一時保持する高速領域
    • 関数処理に名前を付けて再利用できる単位
    • 引数位置引数=順番で渡す。
    • 変数データに名前をつけて参照する仕組み
    • リスト内包表記リストを1行で生成する書き方。
    • 内包表記for と if を 1 行で書く構文
    main.py
    エディタを読み込んでいます

    メモ

    ジェネレータ式

    ⌘S で保存