range() の概要(整数の並びを効率的に作る)
range() は「連続する整数のシーケンス」を生成するための組み込み関数です。for ループと相性が良く、指定した範囲の整数を必要なときに1つずつ取り出す、メモリ効率のよい“イテラブル”を返します。代表的な形は range(stop)、range(start, stop)、range(start, stop, step) の3種類です。終了値(stop)は含まれない半開区間で、ステップは0にできません。
基本の使い方(start・stop・step と半開区間)
1引数・2引数・3引数の違い
- range(n): 0 から n−1 まで
- range(a, b): a から b−1 まで
- range(a, b, s): a から b まで s ずつ(b は含まれない)
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(2, 6))) # [2, 3, 4, 5]
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]
Python終了値が「含まれない」ことが重要です。範囲のズレ(±1のミス)を防ぐには、意図した上限が stop 未満かどうかを意識しましょう。
負のステップで逆順に数える
step を負数にすると、上から下へ逆順の列を作れます。開始値と終了値の関係(開始 > 終了)を満たすようにします。
print(list(range(5, 0, -1))) # [5, 4, 3, 2, 1]
Pythonstep=0 はエラー、float は使えないため、必要なら整数でスケールするか他の手段を選びます。
メモリ効率と「必要なときに取り出す」性質(深掘り)
range() はリストのように全要素を一度に保持しません。必要なタイミングで値を計算して渡す“イテラブル”なので、大きな範囲でもメモリ消費が小さく済みます。確認用に値を一覧したいときだけ list(range(…)) に変換します。
big = range(1_000_000_000) # 巨大でも作成は軽い
# 実際に見るなら
print(big.start, big.stop, big.step) # 1 1000000000 1
Pythonfor ループとの組み合わせ(鉄板パターン)
回数ループとインデックス付き処理
指定回数の処理や、インデックスが必要なときに便利です。インデックスが不要なら enumerate の方が可読性が高い場合もあります。
for i in range(3):
print(i) # 0, 1, 2
fruits = ["apple", "banana", "orange"]
for i in range(len(fruits)):
print(i, fruits[i])
# または:
for i, name in enumerate(fruits):
print(i, name)
Python複数列との併用
zip と組み合わせて「同じ長さの列を並行して」処理できます。
names = ["太郎", "花子"]
points = [92, 88]
for i in range(len(names)):
print(names[i], points[i])
# または:
for name, point in zip(names, points):
print(name, point)
Pythonfor と range の併用は、決まった回数の反復を簡潔に表現できるため、初心者から上級者まで広く使われます。
よくある落とし穴と安全策(重要ポイント)
終了値を「含まない」ことを忘れない
range(a, b) は b を含みません。たとえば 1〜10 を作りたいなら range(1, 11) にします。境界値テストを習慣化するとズレを防げます。
step は 0 にできない、float は扱えない
step=0 はエラーになります。小数刻みが必要な場合は整数にスケールする(例: 0.5刻みなら整数で *2 してから /2 で表示する)、または外部ライブラリ(例: NumPy)を検討します。
逆順は負のステップで
降順は range(start, stop, -1) のように負のステップを使います。start > stop を満たさないと空になります。
例題で身につける(現場の定番)
例題1:合計と平均(決まった回数の加算)
prices = [120, 340, 560]
total = 0
for i in range(len(prices)):
total += prices[i]
avg = total / len(prices)
print(f"合計: {total} / 平均: {avg:.1f}")
Python例題2:九九の一部(2引数の範囲)
for i in range(1, 4): # 1,2,3
for j in range(1, 4): # 1,2,3
print(f"{i}×{j}={i*j}")
Python例題3:逆順カウントダウン(負のステップ)
for n in range(5, 0, -1): # 5,4,3,2,1
print(n)
print("発射!")
Python例題4:フィルタ付き処理(偶数だけ)
for n in range(0, 10, 2): # 0,2,4,6,8
print(n)
Pythonまとめ(押さえるべき重要ポイント)
range() は「半開区間」で整数列を作るイテラブルで、start・stop・step を指定できます。終了値は含まれず、step=0 は不可、float は扱えないため整数で設計するのが基本。for ループと組み合わせて、回数の指定、インデックス処理、逆順、間引きなどを簡潔に書けます。大きな範囲でもメモリ効率が良いので、一覧が必要なときだけ list(…) に変換する習慣を持つと安全です。
