Pythonのfor in構文とは?繰り返し処理を初心者向けに分かりやすく解説

この記事のポイント

Pythonのfor in構文について、基本的な書き方から実践的な応用まで詳しく解説します。

  • for in文の基本的な書き方とコード例による実践的な理解
  • リストや辞書など異なるデータ型での活用方法
  • エラーを避けるための注意点と対処法の習得

プログラミング初心者の方でも段階的に学習できるよう、具体例を交えながら説明していきます。

目次

Pythonのfor in構文とは

Pythonのfor in構文は、リストや文字列などの要素を順番に取り出して処理を繰り返すための基本形です。他のプログラミング言語と比べて自然言語に近い記述ができ、直感的に理解しやすいので多くの場面で活用されています。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

for文とinの意味

for文は繰り返し処理を実行するためのキーワードで、inは処理対象となるデータの集まりを指定する役割を持ちます。forで一時的な変数を宣言し、inの後にリストや文字列を指定することで、その要素を1つずつ取り出して処理できます。基本的な書き方は「for 変数名 in データ集合:」の形になります。

animals = ["ネコ", "イヌ", "ウサギ"] for animal in animals: print(animal)

出力結果

ネコ
イヌ
ウサギ

繰り返し処理の基本構文

Pythonのfor in構文は「for 変数名 in 反復可能オブジェクト:」という形で記述します。コロン(:)の後は必ずインデント(字下げ)を入れて繰り返し実行する処理内容を書きます。ここで設定する変数名は自由に決められ、その変数にはinの後に指定したデータの要素が順番に1つずつ代入されます。処理が終わるとループは自動的に終了します。

numbers = [1, 2, 3] for num in numbers: result = num * 2 print(f"数字{num}を2倍すると{result}です")

出力結果

数字1を2倍すると2です
数字2を2倍すると4です
数字3を2倍すると6です

他言語との違い

CやJavaのfor文では初期値、条件式、増減処理を明示的に記述する必要がありますが、Pythonのfor in文はより簡潔に書けます。

例えばJavaで配列の要素をすべて表示するには「for(int i=0; i<array.length; i++)」のような書き方が必要ですが、Pythonでは要素を直接取得できます。この書きやすさにより、コードの可読性(読みやすさ)が向上し、記述ミスによるエラーも起きにくくなります。

for in構文の基本的な使い方と例

ここからは具体的なfor in構文の使い方を、よく使われるパターン別に詳しく説明していきます。リストrange関数、文字列など、さまざまなデータ型での実践例を通じて理解を深めていきましょう。

リスト(list)を使ったfor inループ

リストはPythonでもっとも基本的なデータ構造の1つで、複数の要素を順番に格納できます。for in文を使うことで、リスト内の全要素を簡単に取り出して処理できます。リストの各要素は角括弧[]で囲んで定義され、ループが実行されるたびに指定した変数に代入されて処理が実行されます。この処理は文字列や数値だけでなく、混在したデータ型でも同様に動作します。

zoo_animals = ["ライオン", "ゾウ", "キリン", "ペンギン"] for zoo_animal in zoo_animals: print(f"動物園には{zoo_animal}がいます")

出力結果

動物園にはライオンがいます
動物園にはゾウがいます
動物園にはキリンがいます
動物園にはペンギンがいます

range関数との組み合わせ

range関数は指定した範囲の数値を順番に自動で生成する関数で、これをfor文と組み合わせることで数値を使った繰り返し処理を簡単に実現できます。例えば、range(5)は0から4まで(5回分)の数値を生成し、range(1, 6)は1から5までの数値を生成します。連続した数値での計算処理や、決まった回数だけ処理を実行したい場合に便利です。

for count in range(1, 4): print(f"{count}匹目のヒツジを数えています") print("ヒツジを数え終わりました")

出力結果

1匹目のヒツジを数えています
2匹目のヒツジを数えています
3匹目のヒツジを数えています
ヒツジを数え終わりました

ネストされたfor in文の書き方

for文の中に別のfor文を入れることをネスト(入れ子)といいます。外側のループが1回実行されるごとに、内側のループが最初から最後まで完全に実行されます。

コードの実行にはインデントを正確に管理することが不可欠で、内側のfor文は外側より4つのスペース(もしくは1つのタブ)を入れて字下げします。2次元リスト(行列のようなデータ)の処理や、複数の条件を組み合わせた複雑な処理でよく使われます。

# 2次元リストの処理 animal_groups = [["トラ", "ヒョウ"], ["クマ", "パンダ"]] for group in animal_groups: for animal in group: print(f"大型動物: {animal}")

出力結果

大型動物: トラ
大型動物: ヒョウ
大型動物: クマ
大型動物: パンダ

for inと他のPython構文の関係

for in文は他の制御構文と組み合わせることで、より柔軟で実用的なプログラムが作れます。例えば、条件分岐(if文)、インデックス処理、並列処理、ループ制御(breakやcontinue)など、実際の開発でよく使われるテクニックを見ていきましょう。

for inとif文の組み合わせ

for文の中でif文を使うことで、条件に合う要素だけを選んで処理できます。ループで取り出した各要素に対して条件判定を行い、その条件が満たされた場合のみ、その内部に記述された特定の処理を実行します。

データのフィルタリング(選別)や条件によって処理を変えたい場合によく使われ、より実用的なプログラムを作成できます。if文もfor文と同様に、インデントで処理範囲を表現します。

farm_animals = ["ウシ", "ニワトリ", "ブタ", "ヒツジ"] for farm_animal in farm_animals: if len(farm_animal) == 2: print(f"{farm_animal}は2文字の動物名です")

出力結果

ウシは2文字の動物名です
ブタは2文字の動物名です

indexを使った繰り返し処理

enumerate関数を使うと、リストの要素と、その要素がリストのどこにあるかを示す番号(インデックスまたは位置番号)を同時に取得できます。for文で「for インデックス, 要素 in enumerate(リスト):」と書くことで、0から始まる連番と要素の両方を利用した処理ができます。要素の位置情報が必要な場合や、データの順番を表示したい場合に便利です。

sea_animals = ["マグロ", "サメ", "イルカ"] for index, sea_animal in enumerate(sea_animals): print(f"{index + 1}番目の海の動物: {sea_animal}")

出力結果

1番目の海の動物: マグロ
2番目の海の動物: サメ
3番目の海の動物: イルカ

複数のリストを同時に処理するzip関数

zip関数は、複数のリストを並行して処理する際に使われます。「for 変数1, 変数2 in zip(リスト1, リスト2):」のように書くことで、同じ位置にある要素を組み合わせて取得できます。もしもリストの長さが異なる場合は、最も短いリストに合わせて処理が終了します。

関連するデータが複数のリストに分かれている場合でも、対応関係を保ちながら処理できます。

animals = ["ゾウ", "キリン", "カバ", "ウサギ"] weights = ["重い", "軽い", "重い"] for animal, weight in zip(animals, weights): print(f"{animal}は{weight}動物です")

出力結果

ゾウは重い動物です
キリンは軽い動物です
カバは重い動物です

break・continueとの組み合わせ

breakは、特定の条件が満たされたときにループ全体を強制終了させる命令です。breakが実行されると、それ以降の要素は処理されません。一方continueは、現在の繰り返し処理だけをスキップして次の要素に進みます。これは、特定の条件をもつ要素だけを飛ばして処理を続けたい場合に有効です。

どちらもif文と組み合わせて、特定の条件下でのみ実行されます。

jungle_animals = ["サル", "ヘビ", "トカゲ", "チョウ", "セミ"] for jungle_animal in jungle_animals: if jungle_animal == "ヘビ": continue if jungle_animal == "チョウ": break print(f"ジャングルで{jungle_animal}を見つけました")

出力結果

ジャングルでサルを見つけました
ジャングルでトカゲを見つけました

for in構文の応用テクニック

基本的な使い方を理解したところで、次により高度なテクニックを学んでみましょう。ここでは、辞書型データの処理やリスト内包表記、例外処理との組み合わせなど、実際のプログラム開発で役立つ応用的な技法を紹介します。

辞書型(dict)をfor inで処理する

辞書型は「キーと値」のペアでデータを管理する構造です。for文では辞書からキーのみ、値のみ、またはキーと値の両方を簡単に取得できます。「for key in dict」でキーのみ、「for value in dict.values()」で値のみ、「for key, value in dict.items()」で両方を取得します。これは、データベースのような構造化されたデータを扱う際に役立ちます。

animal_sounds = {"ネコ": "ニャー", "イヌ": "ワンワン", "ウシ": "モー"} for animal, sound in animal_sounds.items(): print(f"{animal}の鳴き声は{sound}です")

出力結果

ネコの鳴き声はニャーです
イヌの鳴き声はワンワンです
ウシの鳴き声はモーです

リスト内包表記による簡潔なループ

リスト内包表記は、リストを作るためのfor文の処理を1行で簡潔に書く方法です。「[式 for 変数 in リスト]」という形で新しいリストを生成します。さらに条件を加えたい場合は「[式 for 変数 in リスト if 条件]」と書きます。

通常のfor文よりも実行速度が速く、コードも簡潔になりますが、複雑な処理では可読性(コードの理解しやすさ)を損なう場合があるため、処理内容に応じて使い分けることが大切です。

birds = ["スズメ", "カラス", "ハト", "ツバメ", "ツル"] bird_messages = [f"{bird}が飛んでいます" for bird in birds if len(bird) == 2] for message in bird_messages: print(message)

出力結果

ハトが飛んでいます
ツルが飛んでいます

for inと例外処理の組み合わせ

for文の処理中にエラーが発生する可能性がある場合、try-except文を組み合わせることでプログラムを安全に実行できます。リスト内に異なる型のデータが混在している場合や、外部ファイルのデータを処理する際によく使われます。

try文内でエラーが発生してもプログラムが停止せず、代わりにexcept文で指定した処理が実行されて次の要素の処理に続きます。データの信頼性が低く、予期しないデータが入っている場合に特に有効です。

mixed_data = ["ウマ", 100, "ヤギ", None] for data in mixed_data: try: print(f"動物名: {data.upper()}") except AttributeError: print(f"文字列ではないデータ: {data}")

出力結果

動物名: ウマ
文字列ではないデータ: 100
動物名: ヤギ
文字列ではないデータ: None

複雑な条件を扱うfor文のコツ

複数の条件を組み合わせる場合、論理演算子(and、or、not)を使って読みやすいコードを書くように心がけます。条件が複雑になりすぎる場合は、事前に変数に判定結果を保存したり、別の関数として分けて処理したりすることで、保守性(メンテナンスのしやすさ)が向上します。

ネストが深くなりすぎないよう、continueを使って条件を満たさない場合に早期に次の要素へ移る手法も効果的です。コードの可読性を最優先に考えましょう。

pets = [("ハムスター", 2), ("ウサギ", 5), ("フェレット", 1)] for pet_name, age in pets: # 変数に保存してからif文で判定することで、読みやすいようにしている is_small = len(pet_name) <= 5 is_young = age < 3 if is_small and is_young: print(f"{pet_name}({age}歳)は小さくて若いペットです")

出力結果

ハムスター(2歳)は小さくて若いペットです
フェレット(1歳)は小さくて若いペットです

for in構文で起こりやすいエラーと注意点

プログラミング初心者がfor in文を使う際に遭遇しやすいエラーパターンを理解し、適切な対処方法を学びましょう。エラーの原因を事前に知っておくことで、効率的に問題解決(デバッグ)ができるようになります。

TypeErrorとループ対象の型ミス

for in文で処理できるのは反復可能(iterable)なオブジェクトのみです。数値や真偽値(True/False)など、反復できないデータ型をfor文で使おうとするとTypeErrorが発生します。

この問題を避けるためには、事前にtype()関数やhasattr()関数でデータ型をチェックしたり、リストに変換してから処理したりします。エラーが出た際には、エラーメッセージを読むことで原因を特定できます。

# エラーを避ける例 data = 123 # __iter__は、pythonで反復可能なオブジェクトが持っている特殊メソッドの名前 # dataが__iter__メソッドを持っているかを判定している if hasattr(data, '__iter__'): for item in data: print(item) else: print(f"{data}は反復できないデータです") # 数値を文字列にして1桁ずつ処理 for digit in str(data): print(f"桁: {digit}")

出力結果

123は反復できないデータです
桁: 1
桁: 2
桁: 3

breakの位置ミスによる無限ループ

while文とfor文を組み合わせたネスト構造の場合、breakでどのループを終了させたいのかを間違えると予期しない動作になります。

breakは最も内側のループのみを終了するため、外側のループを終了したい場合は別の方法が必要です。例えば、フラグ変数を使って外側のループを制御したり、処理を関数化してreturnで抜けたりする方法があります。ループ構造を明確に理解してから使用しましょう。

# 内側と外側のfor文を抜けるためにそれぞれでbreak文を利用している例 found_animal = False animal_groups = [["トラ", "ライオン"], ["ゾウ", "キリン"]] for group in animal_groups: for animal in group: if animal == "ライオン": print(f"{animal}を発見しました") found_animal = True break if found_animal: break

出力結果

ライオンを発見しました

変数スコープの誤解

for文のループ変数は、ループ終了後も最後に代入された値を保持します。この仕組みを理解せずにループの外でこの変数を参照すると、予期しない結果になることがあるため注意が必要です。

また、ループ内で定義した変数も、Pythonでは関数スコープ(関数全体で有効)のため、ループ外からも参照できます。意図しない変数の参照を避けるため、変数名を適切に管理しましょう。

animals = ["イヌ", "ネコ", "ウサギ"] for animal in animals: current_animal = animal print(f"現在処理中: {current_animal}") print(f"ループ終了後のanimal変数: {animal}") print(f"ループ終了後のcurrent_animal変数: {current_animal}")

出力結果

現在処理中: イヌ
現在処理中: ネコ
現在処理中: ウサギ
ループ終了後のanimal変数: ウサギ
ループ終了後のcurrent_animal変数: ウサギ

想定外の出力結果になる原因

リストの要素を参照渡し(元のデータそのものを指す扱い)で扱っている場合、ループ処理によって元のリストが変更されると予期しない結果になることがあります。また、リストや辞書といった可変オブジェクトをループ中に変更することも危険です。ループ中にリストのサイズが変わると、要素が飛ばされたり、エラーが発生したりします。

このような問題を避けるには、コピーを作成してから処理するか、別のアプローチを検討しましょう。

# 危険な方法:オリジナルを変更 original_pets = ["イヌ", "ネコ", "ハムスター"] for pet in original_pets: if pet == "ネコ": original_pets.remove(pet) print(f"現在のペット: {pet}") print(f"変更後のリスト: {original_pets}")

出力結果(ハムスターの要素が飛ばされてしまう)

現在のペット: イヌ
現在のペット: ネコ
変更後のリスト: ['イヌ', 'ハムスター']
# 安全な方法:コピーを作成してから変更 original_pets = ["イヌ", "ネコ", "ハムスター"] pets_copy = original_pets.copy() for pet in pets_copy: if pet == "ネコ": original_pets.remove(pet) print(f"現在のペット: {pet}") print(f"変更後のリスト: {original_pets}")

出力結果

現在のペット: イヌ
現在のペット: ネコ
現在のペット: ハムスター
変更後のリスト: ['イヌ', 'ハムスター']

よくある質問(Q&A)

Q: for文で同じ処理を指定回数実行するには?

A: range()関数を使用します。「for i in range(回数):」と書くことで、指定した回数だけ処理を繰り返せます。ここで使われる変数iには0から始まる連番が入りますが、処理内容で使わなくても問題ありません。

for i in range(3): print("ニワトリが鳴いています")

出力結果

ニワトリが鳴いています
ニワトリが鳴いています
ニワトリが鳴いています

Q: ループ中に現在何回目かを知るには?

A: enumerate()関数を使うのが最も簡単です。「for 番号, 要素 in enumerate(リスト):」と書くことで、0から始まるカウンタと要素を同時に取得できます。開始番号を変更したい場合はstartパラメータを指定します。

pets = ["イヌ", "ネコ"] for count, pet in enumerate(pets, 1): print(f"{count}匹目: {pet}")

出力結果

1匹目: イヌ
2匹目: ネコ

Q: 空のリストをfor文で処理するとエラーになる?

A: エラーにはなりません。空のリストの場合、for文の処理内容は一度も実行されず、そのまま次の処理に進みます。そのため、事前にlen()関数でリストの長さをチェックする必要はありません。

empty_list = [] for item in empty_list: print("実行されません") print("ここは実行されます")

出力結果

ここは実行されます

Q: for文を1行で書く方法はある?

A: リスト内包表記を使えば、簡単なfor文の処理を1行で書けます。ただし、print()のようにプログラムの状態を変えてしまう副作用のある処理は適さないため、新しいリストの生成や値の変換に使用しましょう。

animals = ["cat", "dog"] upper_animals = [animal.upper() for animal in animals] for animal in animals: print(animal)

出力結果

CAT
DOG

まとめ

Pythonのfor in構文は、プログラミング初心者にとって習得が必須となる基本的かつ実用的な機能です。リスト、文字列、辞書など、さまざまなデータ型を効率的に処理でき、他の制御構文と組み合わせることでより柔軟なプログラムが作成できます。

ポイント

  • for in文の基本構文「for 変数 in データ集合:」
  • range、enumerate、zipなどの組み込み関数とfor文の連携
  • break、continueによるループ制御と条件分岐
  • エラーの原因となりやすいパターンと回避方法
  • リスト内包表記や例外処理との組み合わせによる応用技術

for in構文をマスターすることはデータ処理の基礎を固めることであり、より複雑なプログラムを作るための土台となります。実際にコードを書いて動作確認を繰り返すことで、確実に理解を深められるでしょう。

プログラミングを効率的に学ぶなら、動画とブラウザ上での実行環境が整ったpaizaラーニングの活用がおすすめです。Pythonの講座も多数公開していますので、ぜひチェックしてみてください。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. Pythonのナレッジ記事一覧
  4. Pythonのfor in構文とは?繰り返し処理を初心者向けに分かりやすく解説