【Python入門】for文による繰り返し処理を完全解説!初心者でもわかる使い方とコツ

はじめに

プログラミングを学ぶ上で避けて通れないのが「繰り返し処理」です。Pythonにおけるfor文は、この繰り返し処理を実現するための最も基本的かつ重要な構文の一つです。本記事では、Python初心者の方でも理解できるよう、for文の基礎から実践的な活用方法まで、丁寧に解説していきます。

for文とは何か?なぜ必要なのか

for文とは、指定した回数や条件に従って、同じ処理を繰り返し実行するための制御構文です。プログラミングでは、同じような処理を何度も繰り返す場面が頻繁に発生します。例えば、リストの中身を一つずつ確認したり、1から100までの数値を順番に処理したりする場合などです。

for文を使わずに同じ処理を書こうとすると、コードが非常に長くなり、メンテナンス性も著しく低下します。for文を使うことで、わずか数行のコードで効率的に繰り返し処理を記述できるのです。

Pythonにおけるfor文の基本構文

Pythonのfor文は、他のプログラミング言語と比較して非常にシンプルで読みやすい構文を持っています。基本的な書き方は以下の通りです。

for 変数 in イテラブルオブジェクト:
    繰り返し実行する処理
ここで重要なのは「イテラブルオブジェクト」という概念です。イテラブルとは、要素を一つずつ取り出せるオブジェクトのことを指します。具体的には、リスト、タプル、文字列、辞書、range関数の戻り値などが該当します。

インデント(字下げ)も重要なポイントです。Pythonでは、for文の配下に実行したい処理を記述する際、必ず半角スペース4つ分(またはタブ1つ)のインデントを付ける必要があります。このインデントがPythonにおけるブロック構造を表現する仕組みとなっています。

range関数を使った繰り返し処理

プログラミングでは「指定した回数だけ処理を繰り返す」という場面が頻繁にあります。この時に活躍するのがrange関数です。range関数は、連続した整数を生成するための組み込み関数で、for文と組み合わせることで、カウンタを使った繰り返し処理が実現できます。

range関数には主に3つの使い方があります。1つ目は「range(終了値)」という形式で、0から指定した数値の1つ手前までの整数を生成します。2つ目は「range(開始値, 終了値)」という形式で、開始値から終了値の1つ手前までの整数を生成します。3つ目は「range(開始値, 終了値, ステップ)」という形式で、ステップ値ずつ増加(または減少)させながら整数を生成します。

# 5回繰り返す例
for i in range(5):
    print(f"{i}回目の処理です")

このコードでは、iという変数が0, 1, 2, 3, 4という値を順番に取りながら、print文が5回実行されます。初心者の方がよく混乱するポイントですが、range(5)は0から4までの5つの数値を生成することに注意してください。

リストやタプルを使った繰り返し処理

Pythonのfor文の真骨頂は、リストやタプルといったコレクション型のデータを直接扱える点にあります。他の多くのプログラミング言語では、インデックス番号を使ってリストの要素にアクセスする必要がありますが、Pythonでは要素そのものを直接取り出すことができます。

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
for fruit in fruits:
    print(f"好きな果物は{fruit}です")

この書き方は非常に直感的で、「fruitsリストの中から、一つずつfruitとして取り出して処理する」という意味が一目で理解できます。コードの可読性が高く、バグも入りにくいのが特徴です。

文字列もイテラブルなオブジェクトなので、for文で一文字ずつ取り出すことができます。例えば、文字列の各文字に対して何らかの処理を行いたい場合に便利です。

enumerate関数で要素とインデックスを同時に取得

リストの要素を処理する際、要素の値だけでなく、そのインデックス(位置情報)も同時に必要になることがあります。このような場合に便利なのがenumerate関数です。

enumerate関数を使うと、リストの各要素とそのインデックス番号を同時に取得できます。返されるのはタプル形式のデータで、最初の要素がインデックス、2番目の要素が値となっています。

students = ["田中", "佐藤", "鈴木"]
for index, name in enumerate(students):
    print(f"{index + 1}番目の生徒は{name}さんです")
このコードでは、indexに0, 1, 2という番号が入り、nameに対応する生徒名が入ります。出力時にindex + 1としているのは、人間にとって自然な「1番目、2番目…」という表現にするためです。

enumerate関数には開始番号を指定することもできます。「enumerate(リスト, start=1)」のように書くと、インデックスが1から始まります。これにより、上記のような+1の計算を省略できます。

辞書型データの繰り返し処理

辞書型データ(dictionary)もfor文で効率的に処理できます。辞書は「キー」と「値」のペアでデータを管理するデータ構造で、実務でも非常によく使われます。

辞書をfor文で繰り返す際には、いくつかの方法があります。最もシンプルなのは辞書を直接for文に渡す方法で、この場合はキーのみが取り出されます。キーと値の両方を取得したい場合は、items()メソッドを使用します。

scores = {"数学": 85, "英語": 92, "国語": 78}
for subject, score in scores.items():
    print(f"{subject}の点数は{score}点です")
このコードでは、辞書の各ペアからキーをsubject変数に、値をscore変数に代入しながら処理を進めます。items()メソッドは、キーと値のタプルを順番に返してくれる便利な機能です。

値だけを取り出したい場合はvalues()メソッド、キーだけを明示的に取り出したい場合はkeys()メソッドを使用することもできます。

ネストしたfor文(二重ループ)

for文の中に別のfor文を入れることを「ネスト」または「二重ループ」と呼びます。これは、表形式のデータを処理したり、組み合わせを生成したりする際に頻繁に使用される技術です。

ネストしたfor文では、外側のループが1回実行される間に、内側のループが完全に終了します。つまり、外側のループがN回、内側のループがM回実行される場合、内側の処理はN×M回実行されることになります。

for i in range(3):
    for j in range(2):
        print(f"外側: {i}, 内側: {j}")
このコードを実行すると、(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)という順番で処理が進みます。実務では、二次元配列の処理や、複数のリストの組み合わせを試す際などに活用されます。

ただし、ネストが深くなりすぎるとコードの可読性が低下し、パフォーマンスの問題も発生しやすくなります。三重以上のネストが必要な場合は、処理を関数に分割するなどの工夫を検討しましょう。

break文とcontinue文による制御

for文の実行中に、特定の条件で繰り返しを途中で終了したり、次の繰り返しにスキップしたりしたい場合があります。このような制御を実現するのがbreak文とcontinue文です。

break文は、ループを完全に抜け出すための命令です。特定の条件が満たされた時点で、それ以降の繰り返しを実行せずにループを終了します。例えば、リストの中から特定の値を見つけたら検索を終了する、といった場合に使用します。

continue文は、現在の繰り返しをスキップして次の繰り返しに進むための命令です。特定の条件に該当する要素だけ処理をスキップしたい場合などに便利です。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in numbers:
    if num == 5:
        break  # 5が見つかったらループ終了
    print(num)

このコードでは、1から4までが出力され、5に到達した時点でループが終了します。break文は特に大量のデータを扱う際に、不要な処理を省略してパフォーマンスを向上させる効果があります。

else句を持つfor文

Pythonのfor文には、他の多くのプログラミング言語にはない特徴的な機能があります。それがelse句です。for文のelse句は、ループが正常に終了した場合(つまりbreakで中断されなかった場合)にのみ実行されます。

この機能は、検索処理などで「目的のものが見つからなかった」という状況を判定する際に非常に便利です。従来の方法では、フラグ変数を用意して見つかったかどうかを管理する必要がありましたが、else句を使えばより簡潔に記述できます。

search_target = "山田"
members = ["田中", "佐藤", "鈴木"]
for member in members:
    if member == search_target:
        print(f"{search_target}さんが見つかりました")
        break
else:
    print(f"{search_target}さんは見つかりませんでした")

このコードでは、山田さんがリストにないため、else句が実行されます。もしリストに山田さんがいれば、breakで抜けるためelse句は実行されません。

リスト内包表記との関係

for文と密接に関連する機能として「リスト内包表記」があります。これは、for文を使った繰り返し処理を1行で記述し、新しいリストを生成する記法です。

リスト内包表記は、既存のリストから新しいリストを作成する際、コードを大幅に簡潔にできます。例えば、数値のリストの各要素を2倍にした新しいリストを作る、といった処理が1行で記述できます。

# 通常のfor文
numbers = [1, 2, 3, 4, 5]
doubled = []
for num in numbers:
    doubled.append(num * 2)

# リスト内包表記 doubled = [num * 2 for num in numbers]

両者は同じ結果を生成しますが、リスト内包表記の方が簡潔で読みやすくなります。ただし、複雑な処理や複数行の処理が必要な場合は、通常のfor文を使用した方が可読性が高くなります。

よくあるエラーと対処法

for文を使い始めた初心者がよく遭遇するエラーとその対処法について解説します。

最も多いのが「IndentationError」です。これはインデントが正しくない場合に発生します。Pythonではインデントがコードの構造を決めるため、スペースとタブを混在させたり、インデントの深さが一致していなかったりするとエラーになります。エディタの設定で、タブをスペース4つに自動変換するようにしておくことをお勧めします。

次に多いのが「TypeError: ‘int’ object is not iterable」というエラーです。これは、イテラブルでないオブジェクト(例えば単なる整数)をfor文に渡した場合に発生します。例えば「for i in 5:」と書いてしまうケースです。正しくは「for i in range(5):」と記述する必要があります。

リストのインデックスを使った処理で「IndexError: list index out of range」が発生することもあります。これは、存在しないインデックスにアクセスしようとした場合のエラーです。len()関数でリストの長さを確認するか、直接要素を取り出す書き方に変更することで回避できます。

実践的な活用例

for文は様々な場面で活用できます。データ分析では、CSVファイルから読み込んだデータを1行ずつ処理する際に使用します。Webスクレイピングでは、複数のページを順番に取得して情報を収集する際に活用します。ファイル処理では、フォルダ内の複数ファイルを一括処理する場合などに使用します。

例えば、複数の生徒のテスト結果から、平均点を計算したり、合格者をカウントしたりする処理は、for文を使えば簡単に実装できます。合計点を求める変数を用意し、for文で各生徒の点数を加算していけば、最後に人数で割ることで平均が求められます。

ゲーム開発においても、複数の敵キャラクターの移動処理や衝突判定など、同じ処理を複数のオブジェクトに適用する際にfor文が活躍します。

パフォーマンスを考慮した使い方

大量のデータを処理する場合、for文の書き方次第でパフォーマンスが大きく変わることがあります。特に注意すべきは、ループの中で毎回実行する必要のない処理です。

例えば、リストの長さをlen()関数で取得する処理をループ内で行うと、毎回同じ計算が繰り返されてしまいます。このような固定値は、ループの外で一度だけ計算しておくべきです。また、ループ内で関数を呼び出す場合、その関数が重い処理であれば、結果をキャッシュする工夫も有効です。

大量のデータを扱う場合は、通常のリストの代わりにジェネレータを使用することも検討しましょう。ジェネレータは必要な時に必要な分だけデータを生成するため、メモリ効率が良くなります。

まとめ

Pythonのfor文は、繰り返し処理を実現する強力で柔軟な機能です。基本的な構文はシンプルですが、range関数、enumerate関数、辞書のitems()メソッドなど、様々な関数やメソッドと組み合わせることで、多様な処理を効率的に記述できます。

初心者の方は、まず基本的なリストの繰り返しから始めて、徐々にenumerate関数やbreak/continue文などの応用的な機能を習得していくことをお勧めします。実際にコードを書いて動かすことが、理解を深める最良の方法です。

for文をマスターすることは、Pythonプログラミングの基礎を固める上で非常に重要です。本記事で解説した内容を参考に、ぜひ様々なパターンのfor文を試してみてください。実践を重ねることで、自然と効率的なコードが書けるようになるはずです。

「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■初心者歓迎「AI駆動開発/生成AIエンジニアコース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

格安のプログラミングスクールといえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
対面型でより早くスキル獲得、月額2万円のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<オンライン無料>ゼロから始めるPython爆速講座