コンテンツ

Python速習ガイド - ステップ2 制御フロー (3) - ループ (1)

Info
  • 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
  • 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
  • 各コードは実行して結果を確認することができます。
    ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。

「ステップ2 制御フロー」の続きです。

ループ(繰り返し)は、同じ処理を複数回実行するための制御フローです。
Pythonには主に2種類のループがあります:

  1. for文:リストなどの各要素に対して処理を繰り返す
  2. while文:条件がTrueである限り処理を繰り返す

for文は、リストなどのイテラブル(繰り返し可能)なオブジェクトの各要素に対して、順番に処理を実行します。

for 文
for 変数 in 繰り返し可能なオブジェクト: ループ処理
  • for fruit in fruits の行で、fruitsリスト内の各要素が順番にfruit変数に代入されます
  • その下のインデントされたブロックが、fruitsの要素ごとに繰り返し実行されます
flowchart TD
    START[開始] --> INIT["fruits = ['apple', 'banana', 'orange']"]
    INIT --> FOR{"for fruit in fruits"}
    FOR -->|次の要素がない| END["ループ終了"]
    FOR -->|次の要素がある| LOOP_BODY["ループ処理\n(print(fruit))"]
    LOOP_BODY --> FOR

linkStyle 2 stroke:red,stroke-width:2px;
linkStyle 3 stroke:green,stroke-width:2px;
📚練習問題

fruitsの各要素の文字数を出力し、最後に合計の文字数を出力しましょう。
(文字列の長さは、リストと同様にlen関数で取得できます)

解答例

for文などの繰り返し処理の対象となるオブジェクトのことを イテラブル といいます。
Pythonでは以下のようなオブジェクトがイテラブルとして扱われます:

  • リスト: ["apple", "banana", "orange"]
  • タプル: (1, 2, 3)
  • 集合: {1, 2, 3}
  • 辞書: {"name": "Alice", "age": 25}
  • 文字列: "Python"
  • range関数の戻り値: range(5)

辞書もイテラブルなオブジェクトであり、for文で使用するとキーの一覧を返します。
また、辞書の以下メソッドもイテラブルなオブジェクトを出力します:

  • .keys()メソッド: キー一覧を出力する
  • .values()メソッド: 値一覧を出力する
  • .items()メソッド: キーと値のペアの一覧を出力する
  • 上記の.items()メソッドの例では、アンパックを使用して、
    キーと値のペアを keyvalue に分解して処理を行っています。

文字列もイテラブルなオブジェクトの一種です。
for文で使用すると、1文字ごとの処理を行うことができます。

range関数を使用すると、指定範囲の数値を順に生成することができます。
range関数は、リストのスライスと類似した以下のような複数の使い方があります:

使い方 機能
range(stop) 0 ~ (stop - 1) の整数を順に生成する
range(start, stop) start ~ (stop - 1) の整数を順に生成する
range(start, stop, step) start ~ (stop - 1) の step 間隔の整数を順に生成する
  • range(stop): 0 ~ (stop - 1) の整数を順に生成する
  • range(start, stop): start ~ (stop - 1) の整数を順に生成する
  • range(start, stop, step): start ~ (stop - 1) の step 間隔の整数を順に生成する

スライスと同様に、stepにマイナスの数を指定すると逆順に生成します。

rangeのメモリ効率性
range関数は数値のリストを作成するのではなく、必要に応じて値を生成する「遅延評価」のオブジェクトを返します。
そのため、大きな範囲の数値を扱う場合でもメモリ使用量を抑えることができます。
📚練習問題

1から10までの数値を出力するプログラムをfor文とrange関数を使って作成しましょう。

解答例
📚練習問題

以下のような九九表を出力しましょう。
(ヒント: for文を入れ子(ネスト)にします)

1 x 1 = 1
1 x 2 = 2
...
9 x 9 = 81
解答例

break文を使うと、ループの途中で処理を中断して、ループから抜け出すことができます。

break文
for 変数 in 繰り返し可能なオブジェクト: if 条件: break # ループ処理を抜け出す 通常のループ処理

この例では、fruitsリストを順に処理していますが、「banana」を見つけた時点でbreak文によりループが中断されます。そのため、「orange」以降の要素は処理されません。

flowchart TD
    START[開始] --> INIT["fruits = ['apple', 'banana', 'orange', 'grape', 'melon']"]
    INIT --> FOR{"for fruit in fruits"}

    FOR -->|次の要素がない| END["ループ終了"]
    FOR -->|次の要素がある| ELEMENT_PROCESS

    subgraph ELEMENT_PROCESS[ループ処理]
        LOOP_START["ループ開始"] --> CHECK{"if fruit == 'banana'"}
        CHECK -->|No| NEXT["次の処理へ"]
        CHECK -->|Yes| BREAK["break\n(ループ中断)"]
    end

    NEXT --> FOR
    BREAK --> END

    style BREAK fill:#ffeb3b,stroke:#333,stroke-width:2px

    linkStyle 2 stroke:red,stroke-width:2px;
    linkStyle 3 stroke:green,stroke-width:2px;
    linkStyle 5 stroke:red,stroke-width:2px;
    linkStyle 6 stroke:green,stroke-width:2px;
📚練習問題

リスト内の偶数を見つけたらその数値を出力して処理を中断するプログラムを作成しましょう。

  1. リスト numbers = [15, 7, 3, 9, 4, 11, 2] を用意する
  2. リスト内の各値を順に確認し、最初に見つけた偶数を表示する
  3. 偶数を見つけたらループを中断する
解答例

次に、偶数が存在しない場合には「偶数が存在しません」と表示するように改良しましょう。
(ヒント: 偶数が存在する場合にTrue、そうでない場合にFalseとなる変数を用意しましょう。)

解答例

continue文は、現在のループ処理の残りをスキップし、次の繰り返しに進むための制御フロー文です。
breakがループ全体を終了するのに対し、continueは現在の1回分の繰り返しだけをスキップします。

continue文
for 変数 in 繰り返し可能なオブジェクト: if 条件: continue # 以降の処理をスキップして次のループへ 通常のループ処理

この例では、リスト内の各数値をチェックし、偶数である場合はcontinue文で処理をスキップしています。そのため、奇数のみが表示されます。

flowchart TD
    START[開始] --> INIT["numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"]
    INIT --> FOR{"for num in numbers"}

    FOR -->|次の要素がない| END["ループ終了"]
    FOR -->|次の要素がある| ELEMENT_PROCESS

    subgraph ELEMENT_PROCESS[ループ処理]
        LOOP_START["ループ開始"] --> CHECK{"if num % 2 == 0"}
        CHECK -->|No| NEXT["次の処理へ\n(print(f'数値: {num}'))"]
        CHECK -->|Yes| CONTINUE["continue\n(次のループへ)"]
    end

    NEXT --> FOR
    CONTINUE --> FOR

    style CONTINUE fill:#80deea,stroke:#333,stroke-width:2px

    linkStyle 2 stroke:red,stroke-width:2px;
    linkStyle 3 stroke:green,stroke-width:2px;
    linkStyle 5 stroke:red,stroke-width:2px;
    linkStyle 6 stroke:green,stroke-width:2px;

breakcontinue の違い

キーワード 機能 対象
break ループを完全に終了する ループ全体
continue 現在の繰り返しをスキップして次へ進む 現在の繰り返し
📚練習問題

1から20までの数値の中で、3の倍数でも5の倍数でもない数値だけを出力するプログラムをcontinue文を使用して作成しましょう。

解答例

ループをネスト(入れ子)にした場合、breakcontinue の動作は以下の通りです:

  • break 文は、それを含む最も内側のループのみを終了します
  • continue 文は、それを含む最も内側のループの現在の繰り返しだけをスキップします
📚練習問題

3 x ? または ? x 3 のパターンを除外した九九表を作成しましょう。

解答例

enumerate関数は、イテラブルの各要素に対して、インデックス(位置)と値のペアを取得できます。

インデックスの開始値を変更することもできます:

zip関数は、複数のイテラブルを同時にループ処理する際に便利です。
(for文のネストと異なり、同じ位置のペアのみが必要な場合に使用します)

zipは最も短いイテラブルが終わると停止することに注意してください。

forループにelse節を追加することができます。elseブロックは、ループが正常に終了した場合(breakで中断されなかった場合)に実行されます。

上記のように、for-else文を使用すると、リスト内の要素を検索して見つからなかった場合の処理を簡潔に書けます。

📚練習問題

break文で扱った下記の練習問題を、for-else文を使ってフラグ変数を使用しないコードに書き換えましょう。

  1. リスト numbers = [15, 7, 3, 9, 5, 11, 3] を用意する
  2. リスト内の各値を順に確認し、最初に見つけた偶数を表示する
  3. 偶数を見つけたらループを中断する
  4. 偶数が存在しない場合は「偶数が存在しません」と出力する
解答例
まとめ
  • for文はイテラブル(リスト、文字列、タプル、辞書など)の各要素に対して繰り返し処理を行う
  • range関数を使うと、指定範囲の数値で繰り返し処理ができる
  • break文でループの中断、continue文でループのスキップができる
  • enumerate関数を使うとインデックスと要素を同時に取得できる
  • zip関数を使うと複数のイテラブルを並行して処理できる
  • for-else構文を使うと、ループが正常に完了した場合(中断しなかった場合)の処理を記述できる
📚総合練習問題: 成績処理システム

次の要件を満たす、学生の成績データを処理するプログラムを作成しましょう:

  1. 以下の学生成績データを使用します:

    students = [
        {"name": "田中", "score": 85},
        {"name": "鈴木", "score": 72},
        {"name": "佐藤", "score": 93},
        {"name": "伊藤", "score": 68},
        {"name": "高橋", "score": 76}
    ]
  2. 次の情報を計算して表示してください:

    • 全生徒の平均点
    • 最高得点と、その生徒の名前
    • 80点以上の生徒のリスト(「名前: 得点」の形式)
    • 合格者(70点以上)と不合格者の人数
  3. 出力は見やすく整形してください

解答例

関連記事