Pythonのfor
文は、リストの各要素に同じ処理を順番に当てるための最も基本的な構文です。
本記事では「リストを回すfor
」だけに焦点を当て、構文、実用的な書き方、初心者がつまずきやすいポイント、実行と練習のコツを丁寧に解説します。
まずは動かして慣れ、少しずつ自分の用途に合わせて組み立てられるようになりましょう。
Pythonのfor文(リスト)の基本
for文とは
リストの要素を1つずつ取り出し、同じ処理を繰り返すのがfor
文です。
たとえば買い物リストの各品目を順番に表示したり、数値リストの値を合計したりできます。
リストの長さに合わせて自動的に最後まで回るため、回数管理を自分でする必要はありません。
リストの繰り返し処理のイメージ
リストは「要素が並んだ箱」のようなものです。
箱から要素を1つ取り出して処理し、次に進む、という流れを最後まで繰り返します。
リストの順番がそのまま処理順序になります。
ループ変数の役割
ループ変数は、各回で「今の要素」を受け取る変数です。
名前は自由に付けられますが、中身が読みやすい名前(例: fruit
、price
)にすると理解しやすくなります。
基本構文と読み方
構文テンプレート
リストを回すfor
の基本形は次の通りです。
# 構文テンプレート
# for ループ変数 in リスト:
# (インデントされた処理)
# 例として、リストの要素を表示する
fruits = ["apple", "banana", "cherry"]
for fruit in fruits: # fruit は各要素が順に入る「ループ変数」
print(f"食べる: {fruit}") # ループ本体(インデントされた行)で処理を書く
print("ループ終了")
食べる: apple
食べる: banana
食べる: cherry
ループ終了
読み方とポイント
for fruit in fruits:
は「fruits
の要素を順にfruit
に入れて、以下を繰り返す」という意味です。
行末のコロン(:
)を忘れず、次の行はインデント(スペース)で下げます。
次の表に、構文の各部分の意味を整理します。
構文の部分 | 読み方・意味 | よくある落とし穴 |
---|---|---|
for 変数 in リスト: | リストから要素を1つずつ変数に入れて繰り返す | コロン(: )忘れ、リスト名のタイプミス |
変数 | 各回の要素を受け取る名前 | 途中で別の値を代入しても元のリストは変わらない |
インデントされた行 | ループ本体の処理 | インデントのズレでエラー |
インデント(スペース)の注意
Pythonではインデントが「ブロック」を表すため、スペースの数が揃っていないとエラーになります。
推奨はスペース4つです。
タブとスペースは混ぜないようにします。
推奨スタイル(スペース4つ)
各ブロックはスペース4つで下げると決めて統一します。
# 正しいインデント(スペース4つ)
numbers = [10, 20, 30]
for n in numbers:
print(n) # ←ここは4つ下げる
print("OK")
10
20
30
OK
よくあるエラー例と直し方
インデントがない、あるいはズレているとIndentationErrorになります。
エラー行の直前も含めてインデント幅を確認しましょう。
# 誤った例: インデントがない
for x in [1, 2, 3]:
print(x) # ←下げ忘れ(エラー)
File "example.py", line 3
print(x)
^
IndentationError: expected an indented block
リストを回す基本例
まずは単純にリストを回して表示するところから始めましょう。
この段階で「構文」「インデント」「実行の流れ」に慣れます。
# 基本のループ: 果物名を順番に表示する
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(f"フルーツ: {fruit}")
フルーツ: apple
フルーツ: banana
フルーツ: cherry
for文でできるリスト処理の書き方と例
要素を順番に処理する
リストの各要素に連番を付けて表示するなど、順序を活かした処理ができます。
ここでは手動のカウンタ変数で番号を付けます。
# 順番を示す番号を付けて表示する
tasks = ["洗濯", "買い物", "掃除"]
no = 1 # 手動のカウンタ変数
for task in tasks:
print(f"{no}件目: {task}")
no += 1 # 1ずつ増やす
1件目: 洗濯
2件目: 買い物
3件目: 掃除
値を加工して新しいリストを作る(append)
元のリストをそのままに、加工結果を新しいリストへappend()
で追加していくのが基本パターンです。
元データを壊す心配がありません。
# 数値を2乗した新しいリストを作る
nums = [1, 2, 3, 4]
squares = [] # 空のリストを用意
for n in nums:
squares.append(n * n) # 加工して追加
print("元のリスト:", nums)
print("2乗リスト:", squares)
元のリスト: [1, 2, 3, 4]
2乗リスト: [1, 4, 9, 16]
リスト内包表記でも同じことができますが、今回は繰り返し処理の基本に集中します。
数を数える(カウンタ変数)
カウンタ変数を使えば「いくつあったか」を数えられます。
まずは単純に要素数を数える例です。
# リストの要素数を for で数える
animals = ["cat", "dog", "bird", "dog"]
count = 0
for _ in animals: # 要素は使わないので _ に受ける
count += 1
print(f"要素数: {count}")
要素数: 4
条件付きで数える例もよく使います(条件分岐if
の詳解は別記事で扱います)。
ここでは最低限の使い方だけ示します。
# 3文字以上の名前だけ数える
names = ["a", "bob", "carol", "de", "eve"]
count_long = 0
for name in names:
if len(name) >= 3:
count_long += 1
print(f"3文字以上の数: {count_long}")
3文字以上の数: 2
合計や結合を求める
合計や文字列の結合は「累積」する変数を用意して足し込むのが基本です。
# 数値リストの合計を求める
prices = [120, 300, 450]
total = 0
for p in prices:
total += p # 合計に足し込む
print(f"合計: {total}円")
合計: 870円
# 単語をスペースでつないで1つの文字列にする
words = ["Python", "for", "loop"]
sentence = ""
for w in words:
if sentence != "":
sentence += " " # 先頭以外にスペースを挟む
sentence += w
print(sentence)
Python for loop
文字列の結合はjoin()
も便利ですが、ここではfor文の手順に慣れるために手動で結合しています。
空リストを回すとどうなるか
空リストを回すとループ本体は1回も実行されません。
プログラムが止まったわけではないので安心してください。
# 空リストを回す
data = []
print("開始")
for x in data:
print("これは表示されません")
print("終了")
開始
終了
ループ内のprint()
が出ない=空リストだった、というデバッグの目印にもなります。
初心者がやりがちなミスとコツ
変数名に組み込み名を使わない(listなど)
Pythonの組み込み名(例: list
, sum
)を変数名に使うと、後で本物の関数を呼べずにエラーになります。
# 悪い例: 組み込み名 list を上書きしてしまう
list = [1, 2, 3] # 変数名に list を使ってしまった
print(list)
# 後で「空のリストを作る」つもりで list() を呼ぶと…
list() # TypeError になる
[1, 2, 3]
Traceback (most recent call last):
File "example.py", line 6, in <module>
list()
TypeError: 'list' object is not callable
変数名はitems
やmy_list
のように意味が通る別名にしましょう。
組み込み名は避けるが鉄則です。
ループ中にリストを直接変更しない
ループで回している最中に同じリストをremove()
などで変更すると、要素が飛ばされたり期待と違う結果になりがちです。
# 悪い例: 回しているリストを直接いじる
nums = [1, 2, 2, 2, 3]
for n in nums:
if n == 2:
nums.remove(n) # 2 を見つけたら削除
print(nums) # 2が残ってしまうことがある
[1, 2, 3]
安全な方法は「新しいリストを作ってappend()
する」ことです。
# 良い例: 新しいリストに集める
nums = [1, 2, 2, 2, 3]
filtered = []
for n in nums:
if n != 2:
filtered.append(n)
print(filtered)
[1, 3]
補足: どうしても元のリストを変えたい場合は、元リストの「コピー」を回す(例: for n in nums[:]:
)方法があります。
インデントエラーの対処
スペースの数をそろえる、タブを使わない、エディタの設定で「スペース挿入」を有効にするのが近道です。
エラーが出た行とその前後を確認し、for
行の次の行が4スペースで下がっているかを見直しましょう。
複数行の処理がある場合も、同じ深さでそろえるのがポイントです。
ループ変数の上書きに注意
ループ変数に代入しても元のリストは変わりません。
変換結果を保持したければ新しいリストに入れましょう。
# 期待外れな例: ループ変数を書き換えても元のリストは変わらない
names = ["aya", "bob"]
for name in names:
name = name.upper() # ループ変数を変えてもリストはそのまま
print(names) # 変更されていない
['aya', 'bob']
# 良い例: 新しいリストに集める
names = ["aya", "bob"]
upper_names = []
for name in names:
upper_names.append(name.upper())
print(upper_names)
['AYA', 'BOB']
内側の一時変数は「結果を作るための受け皿」と考えると混乱しにくいです。
実行手順と練習方法
サンプルをコピーして実行する手順
最短で動かすには、エディタでファイルを作りターミナルから実行するのが簡単です。
- エディタで
main.py
を作り、記事のサンプルを貼り付けて保存します。 - ターミナルでファイルのあるフォルダに移動し、
python3 main.py
を実行します(Mac/Linux)。Windowsならpy main.py
でもOKです。 - すぐ結果が出るので、コードを少し変えて再実行しながら挙動を確認します。
補足: 対話実行(REPL)でも練習できますが、ファイルで保存しておくと差分を試しやすいです。
printで動きを確認する
ループ内でprint()
し、変数がどう変わるかを目で追うのが最速のデバッグです。
# ループの中の状態を観察する
nums = [3, 1, 2]
step = 0
for n in nums:
step += 1
print(f"step={step}, n={n}")
print("done")
step=1, n=3
step=2, n=1
step=3, n=2
done
観察ポイント: どの順番で回るか、変数がいつ増えるか、ループの外と中で見える値の違いなどを確認しましょう。
小さく書いて少しずつ増やす
まずは最小のコードで正しく動かし、その後1つずつ機能を加えると、バグの原因を切り分けやすくなります。
# Step 1: とりあえず表示
nums = [1, 2, 3]
for n in nums:
print(n)
1
2
3
# Step 2: 加工して新しいリストへ
nums = [1, 2, 3]
doubles = []
for n in nums:
doubles.append(n * 2)
print(doubles)
[2, 4, 6]
# Step 3: 結果の書式を整える(表示メッセージを追加)
nums = [1, 2, 3]
doubles = []
for n in nums:
doubles.append(n * 2)
print(f"元: {nums} -> 2倍: {doubles}")
元: [1, 2, 3] -> 2倍: [2, 4, 6]
段階的に育てることで、どの変更がどの結果につながったかが明確になります。
まとめ
リストを回すfor
文は、Pythonで最初に身につけたい超基本スキルです。
構文は「for 変数 in リスト:
」とインデント、というシンプルな約束さえ守れば強力に機能します。
新しいリストをappend()
で作る、カウンタで数える、合計や結合を累積する、空リストでは本体が実行されない、といった基本の型を覚えておくと、日々の処理はほとんどこれだけで書けます。
最後に、組み込み名を変数に使わない・ループ中に元リストを直接いじらない・インデントを統一するという3点を意識してください。
小さく試して動きをprint()
で確かめながら、安心してステップアップしていきましょう。