for i in range 徹底解説!基本構文と応用テクニック

pythonのfor in rangeの使い方を初心者にもわかりやすく解説。基本構文から応用テクニック、エラー対策まで、実践的なサンプルコードとともに徹底解説。効率的な繰り返し処理でSEOにも強いPython活用法を紹介します。
目次

python for i in range 早見チートシート

使い方構文例説明出力例
0からn-1まで繰り返すfor i in range(5):0,1,2,3,4の5回繰り返す0 1 2 3 4
任意の開始値から繰り返すfor i in range(2, 6):2,3,4,5の4回繰り返す2 3 4 5
ステップ指定で繰り返すfor i in range(1, 10, 2):1から2ずつ増やして9まで1 3 5 7 9
逆順で繰り返すfor i in range(5, 0, -1):5から1まで1ずつ減らす5 4 3 2 1
リストのインデックスで繰り返すfor i in range(len(lst)):リストの要素数だけ繰り返す0 1 2 …
何も処理しないループfor _ in range(3):変数を使わず3回繰り返す

for文とrange()の基本構文

for文の基本形

Pythonで繰り返し処理を行うときは、for文を使います。
for文の基本的な書き方は以下の通りです。

for 変数 in イテラブル:
    処理

ここで「イテラブル」とは、リストやタプル、文字列、rangeオブジェクトなど、順番に値を取り出せるもののことをいいます。

range()関数の役割

繰り返し回数を指定したい場合によく使うのがrange()関数です。
range()は「指定した範囲の整数」を順番に生成するイテラブル(正確にはrangeオブジェクト)を返します。

典型的なfor in rangeの使い方例

0からn-1まで繰り返す

最もよく使うパターンは、0から指定した回数だけ繰り返す方法です。

for i in range(5):
    print(i)
  1. range(5)は「0, 1, 2, 3, 4」を生成します。
  2. for i in range(5):でiが順番に0, 1, 2, 3, 4となります。
  3. ループ内の処理が5回実行されます。

任意の開始値と終了値を指定する

開始値と終了値を指定して繰り返すこともできます。

for i in range(3, 8):
    print(i)
  1. range(3, 8)は「3, 4, 5, 6, 7」を生成します。
  2. for i in range(3, 8):でiが3から7まで変化します。
  3. ループ内の処理が5回実行されます。

ステップ(増分)を指定して繰り返す

range()の第3引数でステップ(増分)を指定できます。

for i in range(0, 10, 2):
    print(i)
  1. range(0, 10, 2)は「0, 2, 4, 6, 8」を生成します。
  2. iは0から始まり、2ずつ増加します。
  3. 10未満になるまでループが続きます。

逆順で繰り返す

ステップに負の値を指定すると、逆順で繰り返せます。

for i in range(5, 0, -1):
    print(i)
  1. range(5, 0, -1)は「5, 4, 3, 2, 1」を生成します。
  2. iは5からスタートし、1ずつ減少します。
  3. 1までループが続きます。

for in rangeの実用例

リストの要素を順番に処理する

リストの要素をインデックスでアクセスして処理したい場合、for in rangeが便利です。

scores = [80, 90, 75, 60]
for i in range(len(scores)):
    print(f"{i+1}番目の点数は{scores[i]}点です")
  1. len(scores)でリストの要素数(この例では4)を取得します。
  2. range(len(scores))で「0, 1, 2, 3」を生成します。
  3. iを使ってリストの各要素にアクセスし、順番に処理します。

複数回の入力を受け取る

ユーザーから複数回データを入力してリストに格納したいときにも使えます。

names = []
for i in range(3):
    name = input(f"{i+1}人目の名前を入力してください: ")
    names.append(name)
print(names)
  1. range(3)で0から2までの3回ループを作ります。
  2. 各ループでinput関数を使って名前を入力してもらいます。
  3. 入力した名前をリストに追加します。

合計や平均を計算する

数値のリストから合計や平均を計算する処理にも使えます。

numbers = [10, 20, 30, 40]
total = 0
for i in range(len(numbers)):
    total += numbers[i]
print(f"合計は{total}です")
print(f"平均は{total / len(numbers)}です")
  1. 合計用の変数(total)を0で初期化します。
  2. range(len(numbers))でリストの全要素を走査します。
  3. 各要素をtotalに加算します。
  4. ループ終了後、合計や平均を計算します。

エラー回数の制御やリトライ処理

決められた回数だけ処理を繰り返したい場合、for in rangeで簡単に制御できます。

for i in range(3):
    password = input("パスワードを入力してください: ")
    if password == "python":
        print("認証成功!")
        break
    else:
        print("パスワードが違います。")
  1. range(3)で最大3回までループを作ります。
  2. 各ループでパスワードの入力を求めます。
  3. 正しい場合はbreakでループ終了、不正解なら再度入力を促します。

連番のリストやデータを作成する

for in rangeを使って、連番のリストやデータを自動生成することもできます。

ids = []
for i in range(1, 6):
    ids.append(f"user_{i}")
print(ids)
  1. range(1, 6)で1から5までの連番を生成します。
  2. 各番号を使って「user_番号」という文字列を作ります。
  3. できた文字列をリストに追加します。

Pythonicな書き方:enumerateとの比較

for i in rangeとリストのインデックス

リストの要素とインデックスを同時に使いたい場合、for in rangeとlen()を組み合わせる方法があります。

fruits = ["りんご", "みかん", "バナナ"]
for i in range(len(fruits)):
    print(f"{i}番目は{fruits[i]}")
  1. len(fruits)でリストの長さ(要素数)を取得します。
  2. range(len(fruits))で0からリストの長さ-1までの数値を生成します。
  3. iを使ってインデックスでリストの要素にアクセスします。

enumerateを使ったよりPythonicな書き方

Pythonでは、インデックスと要素を同時に取得したい場合、enumerate()を使うのが一般的です。
これが「Pythonic(パイソニック)」な書き方とされています。

fruits = ["りんご", "みかん", "バナナ"]
for i, fruit in enumerate(fruits):
    print(f"{i}番目は{fruit}")
  1. enumerate(fruits)は、(インデックス, 要素)のペアを順番に返します。
  2. for文の中でi, fruitのように2つの変数で受け取ります。
  3. インデックスも要素も同時に使えるので、コードがシンプルで分かりやすくなります。

for in rangeとenumerateの違い

  • for in rangeは、インデックスを使ってリストにアクセスする必要があります。
  • enumerateは、インデックスと要素の両方を同時に取得できます。
  • enumerateを使うと、コードが短くなり、バグも減らせます。

for in rangeとリスト内包表記

リスト内包表記の基本

リスト内包表記は、for文を使って新しいリストを簡潔に作成できるPythonの便利な書き方です。
通常のfor文よりも、コードが短くなり、見やすくなります。

numbers = []
for i in range(5):
    numbers.append(i * 2)

この処理は、リスト内包表記を使うと次のように書けます。

numbers = [i * 2 for i in range(5)]
  1. range(5)で0から4までの整数を生成します。
  2. 各iに対して「i * 2」を計算します。
  3. その結果をリストとしてまとめます。

条件付きリスト内包表記

リスト内包表記は、if文と組み合わせて条件を付けることもできます。

even_numbers = [i for i in range(10) if i % 2 == 0]

このコードは0から9までの偶数だけをリストにします。

  1. range(10)で0から9までの整数を生成します。
  2. 各iについて「i % 2 == 0」(偶数かどうか)を判定します。
  3. 条件を満たすiだけをリストに追加します。

ネストしたfor in rangeのリスト内包表記

リスト内包表記は、for文を複数重ねて使うこともできます。

pairs = [(i, j) for i in range(3) for j in range(2)]

このコードは、iが0~2、jが0~1のすべての組み合わせ(ペア)をリストにします。

  1. 内側のforでiに0, 1, 2を順番に代入します。
  2. 外側のforでjに0, 1を順番に代入します。
  3. (i, j)のペアをすべてリストに追加します。

実用例:九九のリストを作成

リスト内包表記とfor in rangeを組み合わせれば、九九の表も簡単に作れます。

multiplication_table = [i * j for i in range(1, 10) for j in range(1, 10)]
  1. iを1から9まで、jも1から9までループします。
  2. それぞれの組み合わせで「i * j」を計算します。
  3. すべての掛け算の結果をリストにまとめます。

rangeオブジェクトの特徴と注意点

rangeはリストではなく「イテラブル」

range()関数を使うと、リストのように見えますが、実際には「rangeオブジェクト」という特別なイテラブル(繰り返し可能なオブジェクト)が返されます。

r = range(5)
print(r)  # 出力: range(0, 5)
  1. range(5)は「0, 1, 2, 3, 4」を生成するが、実体はリストではありません。
  2. メモリ上にすべての値を持っているわけではなく、必要なときに値を生成します。
  3. for文などで順番に値を取り出して使うことができます。

メモリ効率が良い

rangeオブジェクトは、リストのようにすべての値を一度に持たないため、大きな範囲でもメモリをほとんど消費しません。

r = range(1000000)
print(len(r))  # 出力: 1000000
  1. たとえば100万個の数字をrangeで生成しても、メモリ消費は非常に少ない。
  2. 必要になったときだけ値を計算して返す仕組みになっています。
  3. 大きな繰り返し処理でも安心して使えます。

リストに変換したい場合

rangeオブジェクトをリストとして使いたい場合は、list()で変換できます。

numbers = list(range(5))
print(numbers)  # 出力: [0, 1, 2, 3, 4]
  1. list(range(5))でrangeオブジェクトをリストに変換できます。
  2. 変換後は、リスト特有の操作(インデックスでのアクセスやスライスなど)ができます。

rangeオブジェクトの注意点

  • rangeオブジェクト自体はリストではないので、append()sort()などリスト専用のメソッドは使えません。
  • インデックスアクセスやin演算子は使えますが、値を直接変更することはできません。
r = range(5)
print(r[2])      # 出力: 2
print(3 in r)    # 出力: True
# r.append(5)    # エラーになる
  1. インデックスで値を取得できます(例: r)。
  2. 値が含まれているかどうかをinで調べられます(例: 3 in r)。
  3. ただし、値の変更や追加はできません。

for i in rangeの応用テクニック

ネストしたループ(多重ループ)

for in rangeは、ループを入れ子にして使うことで、表や組み合わせなどの処理ができます。

for i in range(3):
    for j in range(2):
        print(f"i={i}, j={j}")
  1. 外側のループ(i)は0, 1, 2の3回繰り返します。
  2. 内側のループ(j)は0, 1の2回繰り返します。
  3. 各組み合わせごとに処理が実行されます(合計6回)。

条件付きループ

ループ内でif文を使い、特定の条件のときだけ処理を実行できます。

for i in range(10):
    if i % 3 == 0:
        print(i)
  1. 0から9までの数字でループします。
  2. iが3の倍数のときだけprintを実行します。
  3. 条件に合う値(0, 3, 6, 9)だけが出力されます。

逆順ループ

rangeのステップに負の値を指定すると、逆順にループできます。

for i in range(5, 0, -1):
    print(i)
  1. 5から1まで、1ずつ減らしながらループします。
  2. 逆順で値を処理したいときに便利です。

スキップ・途中終了(continue, break)

ループの途中で処理をスキップしたり、ループ自体を終了したりできます。

for i in range(5):
    if i == 2:
        continue  # iが2のときだけスキップ
    if i == 4:
        break     # iが4になったらループ終了
    print(i)
  1. iが2のときはprintをせずに次のループへ進みます(continue)。
  2. iが4になった時点でループを終了します(break)。
  3. 実行結果は0, 1, 3が出力されます。

zipと組み合わせて複数リストを同時に処理

for in rangeとzipを組み合わせることで、複数のリストを同時に処理できます。

names = ["佐藤", "鈴木", "高橋"]
scores = [80, 90, 85]
for name, score in zip(names, scores):
    print(f"{name}さんの点数は{score}点です")
  1. zip(names, scores)で、2つのリストから要素をペアで取り出します。
  2. for文でnameとscoreを同時に受け取ります。
  3. 複数のリストを並行して処理できます。

よくあるエラーとその対策

TypeError: ‘float’ object cannot be interpreted as an integer

range()の引数に小数(float)を渡すとエラーになります。

for i in range(3.5):
    print(i)
# TypeError: 'float' object cannot be interpreted as an integer
  1. range()の引数は整数(int)でなければなりません。
  2. 小数や文字列を渡すとTypeErrorになります。
  3. 必要ならint()で整数に変換してから使います。
for i in range(int(3.5)):
    print(i)

IndexError: list index out of range

range(len(リスト))でリストのインデックスを使うとき、範囲外アクセスに注意が必要です。

lst = [1, 2, 3]
for i in range(4):
    print(lst[i])
# IndexError: list index out of range
  1. range(len(lst))ならインデックスは0〜2になります(この例では3つ)。
  2. それより大きい値までrangeを指定すると、存在しない要素にアクセスしてエラーになります。
  3. 必ずlen(リスト)と同じ範囲でループします。

無限ループ・ループが実行されない

rangeのstart, stop, stepの指定を間違えると、意図しないループ回数になることがあります。

for i in range(5, 10, -1):
    print(i)
# 何も出力されない
  1. stepが負の場合、start > stopでなければループは実行されません。
  2. stepが正の場合、start < stopでなければループは実行されません。
  3. ループが動かない場合は、start, stop, stepの関係を見直します。

rangeオブジェクトにリスト専用メソッドを使ってしまう

rangeオブジェクトはリストではないため、appendやsortは使えません。

r = range(5)
r.append(6)
# AttributeError: 'range' object has no attribute 'append'
  1. rangeはリストのように見えるが、リスト専用メソッドは使えません。
  2. 必要ならlist()でリストに変換してから操作します。
lst = list(range(5))
lst.append(6)

for i in rangeで変数名の使い回しによるバグ

同じ変数名を複数のループで使うと、思わぬバグが起こることがあります。

for i in range(3):
    print(i)
for i in range(2):
    print(i)
# 2つ目のループでiの値が上書きされる
  1. ループごとに変数名を分けると、バグを防げることができます。
  2. 使い回しが必要な場合は、ループの外で値を保存しておきます。

for i in rangeを使いこなして効率的な繰り返し処理を実現しよう

for in range構文は、繰り返し処理をシンプルかつ効率的に記述できる強力なツールです。基本から応用、エラー対策まで理解することで、リスト操作や条件付きループ、リスト内包表記など幅広い場面で活用できます。

rangeオブジェクトの特徴やenumerateとの使い分けも押さえておくと、よりPythonicなコードが書けるようになります。プログラミング初心者から上級者まで必須のテクニックです。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次