Pythonでプログラムを書いていると、「数字を大きい順にカウントダウンさせたい」「リストを末尾から順番に処理したい」という場面に頻繁に遭遇します。
for i in range(10): と書けば 0 から 9 まで順に処理されますが、これを逆順(10, 9, 8…)にしたい場合、Pythonには大きく分けて「range関数のステップ数を指定する方法」と「reversed関数を組み合わせる方法」の2通りが存在します。この記事では、PythonでFor文を逆順に回すための基本知識から、変数を使ってrangeの範囲を動的に指定する際の注意点、さらにはrangeオブジェクトをリスト(list)へ変換する手順まで、サンプルコードを交えて詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
range関数で逆順(降順)の数列を生成する基本
Pythonの range 関数は、引数の渡し方によって「開始値」「終了値」「ステップ(増分)」を制御できます。
逆順の数列を作りたい場合は、この3番目の引数である「ステップ」に負の値を指定するのが基本です。
ここでは、最も標準的な書き方であるrange関数でマイナスのステップ値を指定する仕組みを確認しましょう。
range(開始, 終了, ステップ) の書き方
以下のコードは、10から1までカウントダウンを表示する例です。
# 10から1まで逆順に出力
for i in range(10, 0, -1):
print(i, end=" ")
実行結果
10 9 8 7 6 5 4 3 2 1
このソースコードにおいて最も重要なのは、引数の設定ルールです。
range(10, 0, -1) という記述は、「10から開始し、0の直前(つまり1)まで、-1ずつ加算する」という命令を意味しています。
Pythonの range 関数は終了値に指定した数値そのものは含まれないという特性があるため、1まで表示したい場合には終了値に「0」を指定しなければなりません。
このように、1から10までといった特定の範囲を指定する際(range(1, 11))と同様、終了値の「一歩手前で止まる」という感覚を正しく掴むことが、バグを防ぐための第一歩となります。
for文でリストや変数を逆順に回す応用テクニック
実務では、固定の数値だけでなく、リストの長さや変数を使って動的に逆順ループを組むことが一般的です。
また、コードの読みやすさ(可読性)を重視して、reversed 関数を選択するケースも増えています。
ここでは、開発現場で多用されるPythonのfor文でリストをrangeと組み合わせて操作するテクニックを紹介します。
reversed関数を使った直感的な逆順ループ
数値を計算するのではなく、単純に特定の範囲やオブジェクトを反転させたい場合は、reversed() を使うのがスマートです。
# 0から9の範囲を反転させる
for i in reversed(range(10)):
print(i, end=" ")
実行結果
9 8 7 6 5 4 3 2 1 0
reversed(range(10)) という書き方は、まず range(10) で 0 から 9 までの数列を作り、それを reversed によって丸ごとひっくり返しています。
先ほどのマイナスステップ指定に比べて、「何を(range(10)を)」「どうしたいか(逆順にしたい)」という意図が直感的に伝わりやすいため、複雑な計算が不要な場面ではこちらのほうが好まれる傾向にあります。
特に、変数を利用してループ回数を動的に決めている場合、reversed を使えば「終了値のマイナス1」といった境界条件の計算ミスを劇的に減らすことができるでしょう。
リストのインデックスを逆順に取得する
リストの要素を後ろから操作したい場合に、インデックス(添字)を逆順で回す手法です。
items = ["A", "B", "C", "D"]
size = len(items)
# インデックスを 3, 2, 1, 0 の順で取得
for i in range(size - 1, -1, -1):
print(f"Index {i}: {items[i]}")
実行結果
Index 3: D
Index 2: C
Index 1: B
Index 0: A
このコードの動作ロジックを解説します。
リスト items の長さが4のとき、有効なインデックスは0から3までです。
そのため、開始値には len(items) - 1 すなわち3を指定し、0まで含めるために終了値は-1としています。
このようにリストをrange関数で後ろから処理する際は、常に「最大インデックス」と「最小インデックス(0)」の境界を意識する必要があります。
データの削除など、リストの要素数が変わる操作をループ内で行う場合は、順方向よりも逆方向から処理していくほうが、インデックスのズレによるエラーを回避しやすいため、非常に実戦的なテクニックと言えます。
range型データの操作(リスト変換・結合)
range 関数が返す値は、実はリストではなくPythonのrange型と呼ばれる特殊なオブジェクトです。
メモリ効率は非常に良いのですが、そのままでは中身を直接表示したり、結合したりすることができません。
用途に合わせてデータを加工する方法をマスターしましょう。
rangeオブジェクトをリスト(list)に変換する方法
デバッグ時などに range の中身を一覧で見たい場合は、明示的なキャストが必要です。
# 逆順のrange型オブジェクトを作成
rev_range = range(5, 0, -1)
# そのままprintすると型情報が出る
print(f"型そのまま: {rev_range}")
# リストに変換して表示
rev_list = list(rev_range)
print(f"リスト変換後: {rev_list}")
実行結果
型そのまま: range(5, 0, -1)
リスト変換後: [5, 4, 3, 2, 1]
このソースが意味するのは、Pythonでrangeをリスト形式へ変換する処理を行うことで、不透明なオブジェクトが具体的な要素の並びに変わるということです。
range型は「必要な時にだけ数字を生成する」という性質を持っているため、数万件のデータを扱ってもメモリをほとんど消費しません。
しかし、スライス操作を行ったり、特定の値を書き換えたりしたい場合は、このように list() 関数を使って実体化させる必要があります。
プログラムのパフォーマンスと利便性のバランスを考えて、適切なタイミングで変換を行うのがプロの判断となります。
複数のrangeオブジェクトを結合するテクニック
「10から1まで」と「20から15まで」といった、離れた範囲を繋げて一つのループで回したい場合、itertools.chain を使うのが最も効率的です。
import itertools
# 2つの逆順範囲を定義
range_a = range(5, 0, -1)
range_b = range(15, 10, -1)
# 複数のrangeを繋ぎ合わせて一つのイテレータにする
combined = itertools.chain(range_a, range_b)
for n in combined:
print(n, end=" ")
実行結果
5 4 3 2 1 15 14 13 12 11
通常、range_a + range_b のような足し算でrangeオブジェクト同士を直接結合することはできませんが、itertools.chain を使えば、複数のイテラブルなオブジェクトを一つのストリームとして繋ぎ合わせることが可能です。
これにより、一旦巨大なリストを作成してメモリを圧迫することなく、複数の不連続な範囲をスムーズに処理できます。
複雑なバッチ処理やシミュレーションにおいて、特定の条件に基づいた範囲を繋ぎ合わせたい時に非常に重宝するテクニックです。
Pythonのスキルを活かして年収を上げる方法
以上、Pythonでrange関数で逆順ループを作る方法について解説してきました。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



