【Python】rangeを逆順に扱う方法を初心者向けにわかりやすく解説
はじめに
Pythonで整数の連続した並びを作りたいときは、range という機能を使う方が多いのではないでしょうか。
例えば range(5)
と書けば、0から4までの整数を生成します。
このように順番に数値を取り出して繰り返す処理はとても便利です。
一方で、「大きい数から小さい数へと逆順にループを回したい」 場合があります。
そんなときは range
にマイナスのステップを与えるか、別の組み込み関数を使えば簡単に実現できます。
しかし、実務でこれらをうまく活用するためには注意点を理解し、上手に使い分ける必要があります。
ここでは Python range 逆順 をキーワードに、具体的なコード例とともに、初心者の方にも分かりやすい手順で解説していきます。
この記事を読むとわかること
- rangeの基本的な使い方
- rangeを逆順に使う方法 (マイナスステップ・reversedなど)
- 実務での利用シーンと注意点
- 繰り返し処理を行うときの実装パターン
rangeとは?
Pythonの range
は、整数のシーケンスを生成するための機能です。
多くの場合、以下のように書きます。
range(開始値, 終了値, ステップ)
たとえば range(0, 5, 1)
は 0, 1, 2, 3, 4 の連続した値を生成します。
実際のコードでループに使うときは下記のようになります。
for i in range(5): print(i)
このコードは 0 から 4 まで順番に出力します。
range(5)
は省略形であり、正確には range(0, 5, 1)
と同じ意味を持っています。
rangeの特徴
停止値は含まれない
例えば range(5)
は 0 から 4 までで終わり、5 そのものは生成しません。
ステップ (増分) を任意に設定できる
第3引数に値を指定すれば、その間隔で値を生成します。
例えば range(0, 10, 2)
は 0, 2, 4, 6, 8 のみ生成します。
listやtupleのような直接のデータ構造ではない
range
はイテレータとして機能します。
すぐにメモリ上にすべて展開しない特性があり、長いシーケンスでも効率的に扱えます。
rangeを逆順に扱う方法
通常、rangeは小さい値から大きい値へと増加させるために使われることが多いです。
しかし逆順が必要な場合は、ステップに負の数(マイナス)を指定するか、あるいは reversed関数 を使います。
どちらも場面に応じて使いやすさが違うため、よく知っておくと便利です。
負のステップを指定する
最も直接的な方法は、rangeの第3引数に負の値を入れるやり方です。
例えば大きい数から小さい数まで一つずつデクリメントする場合は、下記のように書きます。
for i in range(5, 0, -1): print(i)
このコードでは 5, 4, 3, 2, 1 の順序で繰り返しが行われます。
ここで注意が必要なのは、終了値は含まれない ことです。
つまり上記の例では最後の1は出力されますが、0や負の値までは出力されません。
「どこまでループを回したいか」を考えながら終了値を設計するのがポイントです。
for文での例
上記コードを実行すると、画面に下記のような結果が出力されます。
5 4 3 2 1
このように、rangeの開始値・終了値・ステップ値をしっかり設定するだけで、きれいに逆順のループを回せます。
もし「5から1まで表示したいのに、実際には5から2までしか表示されない」という状況になったら、範囲指定が間違っている可能性があるので注意しましょう。
reversed()関数を使う
もう一つの方法は、reversed()関数 を使うやり方です。
reversed()
は引数に与えられたシーケンスを逆転させて返す関数です。
rangeをそのまま逆に処理したいときにも有効です。
for i in reversed(range(1, 6)): print(i)
このコードの結果は 5, 4, 3, 2, 1 の順で出力されます。
range(1, 6)
は 1 から 5 までの整数を生成しますが、それを reversed()
でひっくり返しているわけです。
reversed()を使うメリット
- 範囲を指定する際に、開始値と終了値の大小関係に悩まなくてもよい
- 後からコードを読む人にとって、「まず range で順序を作り、それを reversed している」と意図がわかりやすい
逆に、範囲を明確に逆方向へ設定したい場合は、負のステップを使った方がより直感的かもしれません。
処理内容に合わせて好きな方法を使い分けるとよいでしょう。
reversed()
は list や tuple などのシーケンス型にも使うことができます。
たとえばリストの要素を逆順に走査したいときにも同じように書けます。
rangeを逆順で使う実務シーン
ここでは、実務で「小さい数から大きい数へ進む」よりも、「大きい数から小さい数へ進む」ほうが便利なケースを考えてみます。
初心者の方でもイメージしやすいように、なるべく具体的な例を取り上げます。
カウントダウン処理
例えば作業の残り時間を表示したり、タイマー機能を作るときにカウントダウンを行います。
下記のように range(5, 0, -1)
を使えば、5から1までループ処理してカウントダウンを実装することができます。
for seconds_left in range(5, 0, -1): print(f"残り時間: {seconds_left}秒")
このループが1回ごとに何らかの処理を実行するようにすれば、簡単なカウントダウン機能が作れます。
カウントダウン専用のライブラリを使わなくても、rangeの逆順を活用すればシンプルなコードで済みます。
データの逆順アクセス
大きなリストや配列を「後ろから前へ向かって」解析したいことがあります。
例えば最新のデータを最優先で処理するようなケースです。
このときは
for item in reversed(data_list): # 処理
あるいは、あらかじめインデックスを逆順に走査するコードを書く方法があります。
特にデータが多い場合は、インデックスを指定する方がパフォーマンス面で有利なケースもあります。
具体例としては次のようなコードです。
data_list = ["A", "B", "C", "D", "E"] for i in range(len(data_list) - 1, -1, -1): print(data_list[i])
この方法では、最初に len(data_list) - 1
を開始値とし、-1 に向かって下がっていくループを組んでいます。
カウントダウンと同じ要領で実現できるので、必要に応じて活用してみてください。
rangeを逆順で使うときの注意点
ここからは、rangeを逆順で使うときに起こりがちなトラブルや気をつけるべきポイントを整理していきます。
実務で活用するときに間違いやすい部分ですので、しっかりおさえておきましょう。
ステップが0にならないようにする
rangeの第3引数を誤って0としてしまうと、エラーが発生する場合があります。
なぜならステップが0だと無限に増減しないため、プログラムが終了しなくなる可能性があるからです。
Pythonのrangeではステップ0は認められていません。
負のステップを指定するのであれば、必ず -1
などのマイナスの値を設定してください。
停止値を含まず、想定より1つ足りないことに注意
rangeは指定した終了値を含まずに生成します。
負のステップを設定するときは、終了値を「どこまで含めたいのか」をあらかじめ決めておくのが大切です。
たとえば「5から1まで」なのか「5から0まで」なのかを勘違いすると、意図しない動作になることがあります。
# 5から1までの例 for i in range(5, 0, -1): print(i) # 5,4,3,2,1 # 5から0までの場合 for i in range(5, -1, -1): print(i) # 5,4,3,2,1,0
上記のように、終了値の指定が違えば生成されるシーケンスも変わってきます。
あらかじめ適切な値を設定しておかないと、想定外のバグを引き起こす可能性があります。
reversed() を使う場合との違い
reversed()
は、最初に生成されたシーケンスをそのまま反転させる仕組みです。
そのため最初の range に含まれる値をもう一度逆向きで取り出すだけです。
最初に与えられた範囲を超えたものは得られない点には注意しましょう。
一方で、負のステップを使うrangeは、最初から「大きい数から小さい数への順番」で値を生成します。
そのため逆順のシーケンスを意図的に作りたい場合は負のステップ、単に後から逆転させればいい場合は reversed() と使い分けるのも一つの考え方です。
まとめ
Pythonのrangeを逆順に使う方法は、実はシンプルな仕組みで実現できます。
多くのケースでは以下2つを理解しておけば事足りるでしょう。
- rangeのステップに負の値を与える
- reversed()関数を使ってシーケンスを逆転させる
どちらの方法も覚えておくと、さまざまなシーンで役に立ちます。
たとえばカウントダウン処理やリストの末尾からの探索などで活躍する場面は多いです。
負のステップを使う場合は、終了値を含まない特性に要注意です。
終了値とステップを間違えると、意図したシーケンスにならずバグが生まれるかもしれません。
逆に reversed()
を使う場合は、もともとの range の定義がどうなっているかを把握する必要があります。
このように range を逆順に扱うことで、Pythonでのループ処理がより柔軟に書けるようになります。
今回の内容をしっかり理解しておけば、実務でもバグなく落ち着いてコードを書きやすくなるのではないでしょうか。
ぜひ活用してみてくださいね。