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)
range(5)
は「0, 1, 2, 3, 4」を生成します。for i in range(5):
でiが順番に0, 1, 2, 3, 4となります。- ループ内の処理が5回実行されます。
任意の開始値と終了値を指定する
開始値と終了値を指定して繰り返すこともできます。
for i in range(3, 8):
print(i)
range(3, 8)
は「3, 4, 5, 6, 7」を生成します。for i in range(3, 8):
でiが3から7まで変化します。- ループ内の処理が5回実行されます。
ステップ(増分)を指定して繰り返す
range()の第3引数でステップ(増分)を指定できます。
for i in range(0, 10, 2):
print(i)
range(0, 10, 2)
は「0, 2, 4, 6, 8」を生成します。- iは0から始まり、2ずつ増加します。
- 10未満になるまでループが続きます。
逆順で繰り返す
ステップに負の値を指定すると、逆順で繰り返せます。
for i in range(5, 0, -1):
print(i)
range(5, 0, -1)
は「5, 4, 3, 2, 1」を生成します。- iは5からスタートし、1ずつ減少します。
- 1までループが続きます。
for in rangeの実用例
リストの要素を順番に処理する
リストの要素をインデックスでアクセスして処理したい場合、for in rangeが便利です。
scores = [80, 90, 75, 60]
for i in range(len(scores)):
print(f"{i+1}番目の点数は{scores[i]}点です")
len(scores)
でリストの要素数(この例では4)を取得します。range(len(scores))
で「0, 1, 2, 3」を生成します。- iを使ってリストの各要素にアクセスし、順番に処理します。
複数回の入力を受け取る
ユーザーから複数回データを入力してリストに格納したいときにも使えます。
names = []
for i in range(3):
name = input(f"{i+1}人目の名前を入力してください: ")
names.append(name)
print(names)
range(3)
で0から2までの3回ループを作ります。- 各ループでinput関数を使って名前を入力してもらいます。
- 入力した名前をリストに追加します。
合計や平均を計算する
数値のリストから合計や平均を計算する処理にも使えます。
numbers = [10, 20, 30, 40]
total = 0
for i in range(len(numbers)):
total += numbers[i]
print(f"合計は{total}です")
print(f"平均は{total / len(numbers)}です")
- 合計用の変数(total)を0で初期化します。
range(len(numbers))
でリストの全要素を走査します。- 各要素をtotalに加算します。
- ループ終了後、合計や平均を計算します。
エラー回数の制御やリトライ処理
決められた回数だけ処理を繰り返したい場合、for in rangeで簡単に制御できます。
for i in range(3):
password = input("パスワードを入力してください: ")
if password == "python":
print("認証成功!")
break
else:
print("パスワードが違います。")
range(3)
で最大3回までループを作ります。- 各ループでパスワードの入力を求めます。
- 正しい場合はbreakでループ終了、不正解なら再度入力を促します。
連番のリストやデータを作成する
for in rangeを使って、連番のリストやデータを自動生成することもできます。
ids = []
for i in range(1, 6):
ids.append(f"user_{i}")
print(ids)
range(1, 6)
で1から5までの連番を生成します。- 各番号を使って「user_番号」という文字列を作ります。
- できた文字列をリストに追加します。
Pythonicな書き方:enumerateとの比較
for i in rangeとリストのインデックス
リストの要素とインデックスを同時に使いたい場合、for in rangeとlen()を組み合わせる方法があります。
fruits = ["りんご", "みかん", "バナナ"]
for i in range(len(fruits)):
print(f"{i}番目は{fruits[i]}")
len(fruits)
でリストの長さ(要素数)を取得します。range(len(fruits))
で0からリストの長さ-1までの数値を生成します。- iを使ってインデックスでリストの要素にアクセスします。
enumerateを使ったよりPythonicな書き方
Pythonでは、インデックスと要素を同時に取得したい場合、enumerate()
を使うのが一般的です。
これが「Pythonic(パイソニック)」な書き方とされています。
fruits = ["りんご", "みかん", "バナナ"]
for i, fruit in enumerate(fruits):
print(f"{i}番目は{fruit}")
enumerate(fruits)
は、(インデックス, 要素)のペアを順番に返します。- for文の中で
i, fruit
のように2つの変数で受け取ります。 - インデックスも要素も同時に使えるので、コードがシンプルで分かりやすくなります。
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)]
range(5)
で0から4までの整数を生成します。- 各iに対して「i * 2」を計算します。
- その結果をリストとしてまとめます。
条件付きリスト内包表記
リスト内包表記は、if文と組み合わせて条件を付けることもできます。
even_numbers = [i for i in range(10) if i % 2 == 0]
このコードは0から9までの偶数だけをリストにします。
range(10)
で0から9までの整数を生成します。- 各iについて「i % 2 == 0」(偶数かどうか)を判定します。
- 条件を満たすiだけをリストに追加します。
ネストしたfor in rangeのリスト内包表記
リスト内包表記は、for文を複数重ねて使うこともできます。
pairs = [(i, j) for i in range(3) for j in range(2)]
このコードは、iが0~2、jが0~1のすべての組み合わせ(ペア)をリストにします。
- 内側のforでiに0, 1, 2を順番に代入します。
- 外側のforでjに0, 1を順番に代入します。
- (i, j)のペアをすべてリストに追加します。
実用例:九九のリストを作成
リスト内包表記とfor in rangeを組み合わせれば、九九の表も簡単に作れます。
multiplication_table = [i * j for i in range(1, 10) for j in range(1, 10)]
- iを1から9まで、jも1から9までループします。
- それぞれの組み合わせで「i * j」を計算します。
- すべての掛け算の結果をリストにまとめます。
rangeオブジェクトの特徴と注意点
rangeはリストではなく「イテラブル」
range()
関数を使うと、リストのように見えますが、実際には「rangeオブジェクト」という特別なイテラブル(繰り返し可能なオブジェクト)が返されます。
r = range(5)
print(r) # 出力: range(0, 5)
range(5)
は「0, 1, 2, 3, 4」を生成するが、実体はリストではありません。- メモリ上にすべての値を持っているわけではなく、必要なときに値を生成します。
- for文などで順番に値を取り出して使うことができます。
メモリ効率が良い
rangeオブジェクトは、リストのようにすべての値を一度に持たないため、大きな範囲でもメモリをほとんど消費しません。
r = range(1000000)
print(len(r)) # 出力: 1000000
- たとえば100万個の数字をrangeで生成しても、メモリ消費は非常に少ない。
- 必要になったときだけ値を計算して返す仕組みになっています。
- 大きな繰り返し処理でも安心して使えます。
リストに変換したい場合
rangeオブジェクトをリストとして使いたい場合は、list()
で変換できます。
numbers = list(range(5))
print(numbers) # 出力: [0, 1, 2, 3, 4]
list(range(5))
でrangeオブジェクトをリストに変換できます。- 変換後は、リスト特有の操作(インデックスでのアクセスやスライスなど)ができます。
rangeオブジェクトの注意点
- rangeオブジェクト自体はリストではないので、
append()
やsort()
などリスト専用のメソッドは使えません。 - インデックスアクセスや
in
演算子は使えますが、値を直接変更することはできません。
r = range(5)
print(r[2]) # 出力: 2
print(3 in r) # 出力: True
# r.append(5) # エラーになる
- インデックスで値を取得できます(例: r)。
- 値が含まれているかどうかを
in
で調べられます(例: 3 in r)。 - ただし、値の変更や追加はできません。
for i in rangeの応用テクニック
ネストしたループ(多重ループ)
for in rangeは、ループを入れ子にして使うことで、表や組み合わせなどの処理ができます。
for i in range(3):
for j in range(2):
print(f"i={i}, j={j}")
- 外側のループ(i)は0, 1, 2の3回繰り返します。
- 内側のループ(j)は0, 1の2回繰り返します。
- 各組み合わせごとに処理が実行されます(合計6回)。
条件付きループ
ループ内でif文を使い、特定の条件のときだけ処理を実行できます。
for i in range(10):
if i % 3 == 0:
print(i)
- 0から9までの数字でループします。
- iが3の倍数のときだけprintを実行します。
- 条件に合う値(0, 3, 6, 9)だけが出力されます。
逆順ループ
rangeのステップに負の値を指定すると、逆順にループできます。
for i in range(5, 0, -1):
print(i)
- 5から1まで、1ずつ減らしながらループします。
- 逆順で値を処理したいときに便利です。
スキップ・途中終了(continue, break)
ループの途中で処理をスキップしたり、ループ自体を終了したりできます。
for i in range(5):
if i == 2:
continue # iが2のときだけスキップ
if i == 4:
break # iが4になったらループ終了
print(i)
- iが2のときはprintをせずに次のループへ進みます(continue)。
- iが4になった時点でループを終了します(break)。
- 実行結果は0, 1, 3が出力されます。
zipと組み合わせて複数リストを同時に処理
for in rangeとzipを組み合わせることで、複数のリストを同時に処理できます。
names = ["佐藤", "鈴木", "高橋"]
scores = [80, 90, 85]
for name, score in zip(names, scores):
print(f"{name}さんの点数は{score}点です")
- zip(names, scores)で、2つのリストから要素をペアで取り出します。
- for文でnameとscoreを同時に受け取ります。
- 複数のリストを並行して処理できます。
よくあるエラーとその対策
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
- range()の引数は整数(int)でなければなりません。
- 小数や文字列を渡すとTypeErrorになります。
- 必要なら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
- range(len(lst))ならインデックスは0〜2になります(この例では3つ)。
- それより大きい値までrangeを指定すると、存在しない要素にアクセスしてエラーになります。
- 必ずlen(リスト)と同じ範囲でループします。
無限ループ・ループが実行されない
rangeのstart, stop, stepの指定を間違えると、意図しないループ回数になることがあります。
for i in range(5, 10, -1):
print(i)
# 何も出力されない
- stepが負の場合、start > stopでなければループは実行されません。
- stepが正の場合、start < stopでなければループは実行されません。
- ループが動かない場合は、start, stop, stepの関係を見直します。
rangeオブジェクトにリスト専用メソッドを使ってしまう
rangeオブジェクトはリストではないため、appendやsortは使えません。
r = range(5)
r.append(6)
# AttributeError: 'range' object has no attribute 'append'
- rangeはリストのように見えるが、リスト専用メソッドは使えません。
- 必要なら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の値が上書きされる
- ループごとに変数名を分けると、バグを防げることができます。
- 使い回しが必要な場合は、ループの外で値を保存しておきます。
for i in rangeを使いこなして効率的な繰り返し処理を実現しよう
for in range構文は、繰り返し処理をシンプルかつ効率的に記述できる強力なツールです。基本から応用、エラー対策まで理解することで、リスト操作や条件付きループ、リスト内包表記など幅広い場面で活用できます。
rangeオブジェクトの特徴やenumerateとの使い分けも押さえておくと、よりPythonicなコードが書けるようになります。プログラミング初心者から上級者まで必須のテクニックです。
関連記事
- Pythonのif文をマスター!基礎から応用まで徹底解説!
- 【Python入門】enumerate関数の使い方完全ガイド!
- 【完全ガイド】PythonでCSV出力する方法を徹底解説!
- 【完全ガイド】pyenvをインストールしてPythonバージョンを効率的に管理!
- Python入門講座 基本概念編!データ型・演算子・文字列を理解しよう!
- Python入門講座 制御構造編!if文・for文・while文を理解しよう!
- Python入門講座 関数とモジュール編!コードを機能毎にまとめてみよう!
- Python入門講座 データ構造編!リスト・タプル・辞書・セットを理解しよう!
- Python入門講座 ファイル操作編!読み込み・書き込み・追記を身に着けよう!
- Python入門講座 エラーと例外処理編!信頼性の高いプログラムを作ろう!
- Python入門講座 オブジェクト指向プログラミング編!クラス・オブジェクトを理解しよう!
- Python入門講座 ライブラリとフレームワーク編!効率的にコーディングしよう!