プログラミング

Step 11: 繰り返し処理の「for文」で作業を自動化する

Step 11: 繰り返し処理の「for文」で作業を自動化する

概要

フリーランスエンジニア スリーネクスト

Pythonにおける繰り返し処理の中核をなす「for文」について、初心者にも分かりやすく解説します。基本的なfor 変数 in イテラブル:の構文から始め、リストやrange()関数を使った具体的な繰り返し方法を学びます。

さらに、break文での途中終了、continue文によるスキップ、ループが正常終了した際に実行されるelse文、そして九九の表などで用いるネスト(入れ子)構造までを網羅。Mermaid形式のフローチャートを多用し、複雑な処理の流れも視覚的に理解できるよう工夫しています。作業自動化の必須スキルを習得するためのガイドです。

はじめに

プログラミングの大きな強みの一つは、面倒な繰り返し作業をコンピュータに任せて自動化できることです。例えば、「リストに入っている生徒全員の名前を順番に表示する」「1から100までの数字を足し合わせる」といった単純作業は、人間が手作業で行うと時間もかかりますし、ミスも起こりがちです。

Pythonでは、このような繰り返し処理を簡単かつ正確に行うために**for文**(フォーぶん)という仕組みが用意されています。今回は、このfor文をマスターして、プログラミングによる自動化の第一歩を踏み出しましょう!

for文の基本的な仕組み

for文は、リストや文字列など、複数の要素が集まったもの(イテラブルオブジェクトと呼びます)から、要素を一つずつ順番に取り出して、決まった処理を繰り返すための構文です。

基本的な形は以下の通りです。

for 変数 in イテラブルオブジェクト:
    # 繰り返し実行したい処理
    # この部分はインデント(字下げ)する
  • for: 「これから繰り返しを始めます」という合図です。
  • 変数: 取り出した要素を一時的に入れておくための箱(変数)です。この変数名は自分で自由に決められます(例: item, name, iなど)。
  • in: forとセットで使い、「〜の中から」という意味を持ちます。
  • イテラブルオブジェクト: リスト、タプル、文字列、range()関数など、繰り返し取り出せる要素の集まりです。
  • : (コロン): 「ここからが繰り返す処理のブロックです」という合図です。忘れずに付けましょう。
  • インデントされたブロック: コロンの後、インデント(通常は半角スペース4つ)された部分が、要素の数だけ繰り返し実行される処理です。

この流れを図で見てみましょう。

graph TD
    A[ループ開始] --> B{"イテラブルに次の要素はある?"};
    B -- Yes --> C[要素を変数に取り出す];
    C --> D[インデント内の処理を実行する];
    D --> B;
    B -- No --> E[ループ終了];

様々なデータでfor文を使ってみよう

for文がどれだけ便利か、具体的なデータ(イテラブルオブジェクト)を使って見ていきましょう。

1. リスト (list)

最もよく使われるのがリストです。リストの要素が順番に取り出されます。

# 果物のリスト
fruits = ["りんご", "バナナ", "みかん"]

# リストの要素を一つずつ取り出して表示する
for fruit in fruits:
    print(f"今、取り出した果物は「{fruit}」です。")

# 実行結果
# 今、取り出した果物は「りんご」です。
# 今、取り出した果物は「バナナ」です。
# 今、取り出した果物は「みかん」です。

fruitsリストから、まず"りんご"がfruit変数に入り、print文が実行されます。次に"バナナ"がfruit変数に入りprint文が実行...というように、リストの要素がなくなるまで繰り返されます。

2. 文字列 (str)

文字列をfor文で使うと、1文字ずつ順番に取り出して処理できます。

greeting = "こんにちは"

for char in greeting:
    print(char)

# 実行結果
# こ
# ん
# に
# ち
# は

3. range()関数:決まった回数だけ繰り返す

「5回だけ『こんにちは』と表示したい」のように、決まった回数だけ処理を繰り返したい場合に非常に便利なのが**range()関数**です。range()は、連続した数値を生成するイテラブルオブジェクトを作成します。

使い方① range(終了する数) 0から「終了する数 - 1」までの連続した数値を生成します。

for i in range(5):  # 0, 1, 2, 3, 4 の数値を生成
    print(f"{i+1}回目のこんにちは")

# 実行結果
# 1回目のこんにちは
# 2回目のこんにちは
# 3回目のこんにちは
# 4回目のこんにちは
# 5回目のこんにちは

range(5)[0, 1, 2, 3, 4] と同じような数値の集まりをイメージすると分かりやすいです。

使い方② range(開始する数, 終了する数) 「開始する数」から「終了する数 - 1」までの数値を生成します。

# 1から5までの合計を計算する
total = 0
for num in range(1, 6):  # 1, 2, 3, 4, 5 の数値を生成
    total = total + num
    print(f"{num}まで足した合計: {total}")

print(f"最終的な合計: {total}")

# 実行結果
# 1まで足した合計: 1
# 2まで足した合計: 3
# 3まで足した合計: 6
# 4まで足した合計: 10
# 5まで足した合計: 15
# 最終的な合計: 15

for文をさらに便利にする機能

for文には、繰り返し処理をより柔軟にコントロールするための追加機能があります。

break文:ループを途中で抜ける

break文を使うと、特定の条件が満たされた時に、ループを強制的に終了させることができます。

graph TD
    subgraph "forループ"
        A[要素を取り出す] --> B{"breakの条件が成立?"};
        B -- Yes --> F[ループを強制終了];
        B -- No --> D[今回の処理を実行];
        D --> A;
    end
    F --> G[ループ後の処理へ];

例えば、リストの中から特定の数値を見つけたら、それ以降を探す必要はない、といった場合に使います。

numbers = [1, 8, 3, 10, 5, 7]

# リストから「10」を見つけたらループを終了する
for num in numbers:
    print(f"チェック中の数値: {num}")
    if num == 10:
        print("「10」を見つけました!")
        break  # ここでループが終了する

# 実行結果
# チェック中の数値: 1
# チェック中の数値: 8
# チェック中の数値: 3
# チェック中の数値: 10
# 「10」を見つけました!

num10になった時点でif文の条件が満たされ、breakが実行されます。そのため、後ろにある57は処理されずにループが終了します。

continue文:今回の処理だけをスキップする

continue文は、ループを終了するのではなく、現在の回の処理だけをスキップして、すぐに次の繰り返しに進むための命令です。

graph TD
    subgraph "forループ"
        A[要素を取り出す] --> B{"continueの条件が成立?"};
        B -- Yes --> A;
        B -- No --> D[今回の処理を実行];
        D --> A;
    end

例えば、リストの中から偶数だけを処理したい(奇数は無視したい)場合に使えます。

# 1から10までの数値のうち、偶数だけを表示する
for i in range(1, 11):
    if i % 2 != 0:  # iを2で割った余りが0でない(奇数の)場合
        continue    # 今回の処理をスキップして次のループへ
    
    # このprint文は、continueされなかった場合(偶数の場合)のみ実行される
    print(f"偶数です: {i}")

# 実行結果
# 偶数です: 2
# 偶数です: 4
# 偶数です: 6
# 偶数です: 8
# 偶数です: 10

else文:ループが最後まで実行された時に処理する

for文には、珍しいことにelseブロックを付けることができます。このelseブロックは、ループがbreakされずに、最後まで正常に完了した場合にのみ実行されます。

numbers = [1, 3, 5, 7]

# リストに偶数が含まれているかチェック
for num in numbers:
    if num % 2 == 0:
        print("偶数を見つけました。")
        break
else:
    # forループが一度もbreakされなかった場合に実行される
    print("リストの中に偶数はありませんでした。")

# 実行結果
# リストの中に偶数はありませんでした。

この例では、リストnumbersに偶数が一つも含まれていないため、breakが一度も実行されません。その結果、ループが最後まで回りきった後にelseブロックの処理が実行されます。


ネスト(入れ子)のfor

for文の中に、さらに別のfor文を入れることもできます。これを**ループのネスト(入れ子)**と呼びます。九九の表を作成する際などによく使われます。

# 九九の表を作成する
for i in range(1, 10):  # 外側のループ(1の段、2の段...)
    for j in range(1, 10):  # 内側のループ(x1, x2...)
        # printのend=""は、改行せずにスペースを空けて出力するための設定
        print(f"{i*j:2d}", end=" ") 
    print() # 内側のループが1周したら改行する

このコードの動きは以下のようになります。

  1. 外側のループで i1 になる。
  2. 内側のループが始まり、j1 から 9 まで変化し、1*1, 1*2, ..., 1*9 が計算・表示される。
  3. 内側のループが終了すると、print()で改行される。
  4. 外側のループに戻り、i2 になる。
  5. 再び内側のループが始まり、j1 から 9 まで変化し、2*1, 2*2, ..., 2*9 が計算・表示される。
  6. ...これを i9 になるまで繰り返す。
graph TD
    A(外側ループ開始 i=1) --> B{j=1..9};
    B --> C(i * j を計算・表示);
    A --> D(外側ループ i=2) --> E{j=1..9};
    E --> F(i * j を計算・表示);
    D --> G(...)

まとめ

今回は、繰り返し処理を行うためのfor文について学びました。

  • for文の基本: for 変数 in イテラブルオブジェクト: の形で、リストなどの要素を一つずつ処理する。
  • range()関数: 決まった回数の繰り返しに非常に便利。
  • breakcontinue: ループの流れを細かく制御できる。
  • ネスト: ループを入れ子にすることで、より複雑な繰り返し処理(九九の表など)が可能になる。

for文は、プログラミングで作業を自動化するための根幹となる非常に重要な機能です。たくさんのコードを書いて、その動きに慣れていきましょう。for文を使いこなせるようになれば、あなたのプログラミングスキルは格段にレベルアップするはずです。

-プログラミング