Pythonのrange()関数を徹底解説!forループの必須知識をマスターしよう

こんにちは。ゆうせいです。

Pythonでforループを使って「10回繰り返す」「1から100まで処理する」といった処理を書きたいとき、必ずと言っていいほど登場するのがrange()関数ですよね。

とても便利な関数ですが、「range(5)と書くと、なぜか4までしか表示されない…」といったように、最初は少し不思議な挙動に戸惑うこともあるかもしれません。

今回は、このrange()関数の仕組みと使い方を、3つの基本パターンに分けてじっくりと解説していきます。この記事を読み終える頃には、もうループ処理で迷うことはなくなりますよ!


range()関数の基本:3つの使い方

range()関数の使い方は、引数の数によって大きく3つのパターンに分かれます。

一つずつ見ていきましょう!

1. range(stop):終わりだけを指定する

これが最もシンプルな使い方です。引数を一つだけ渡すと、0から始まり、指定した数の直前までの連続した数値を生成します。

ポイントは、指定した数そのものは含まれないということです。

range(5)は、「5になる前にストップ!」という意味だと考えると分かりやすいですよ。

# 0から4まで(5回)のループ
for i in range(5):
    print(i)

# 出力結果:
# 0
# 1
# 2
# 3
# 4

2. range(start, stop):始まりと終わりを指定する

引数を二つ渡すと、「開始する数」と「終わる数」を指定できます。

この場合もルールは同じで、startから始まり、stopの直前までの数値が生成されます。

# 1から5までのループ
for i in range(1, 6):
    print(i)

# 出力結果:
# 1
# 2
# 3
# 4
# 5

6を指定することで、5まできっちり処理されているのが分かりますね。

3. range(start, stop, step):歩幅(ステップ)も指定する

三つ目の引数stepを指定すると、数値がいくつずつ増えるか(あるいは減るか)という「歩幅」をコントロールできます。

例えば、偶数だけを処理したいときに便利です。

# 0から10未満まで、2ずつ増やしながらループ
for i in range(0, 10, 2):
    print(i)

# 出力結果:
# 0
# 2
# 4
# 6
# 8

このstepにはマイナスの値を指定することもできます。そうすると、数値をカウントダウンさせることも可能です。

# 5から1まで、1ずつ減らしながらループ
for i in range(5, 0, -1):
    print(i)

# 出力結果:
# 5
# 4
# 3
# 2
# 1


range()の正体はリストじゃない?

ここで一つ、とても大切な話をします。

range(100)と書いたとき、Pythonは[0, 1, 2, ..., 99]のような、100個の要素を持つ巨大なリストをメモリ上に作っているわけではありません。

試しに、range(10)をそのままprintしてみると、中身は表示されません。

print(range(10))
# 出力結果: range(0, 10)

range()が作るのは、実は「こういうルールで数値を生成できますよ」という情報(開始、終了、ステップ)だけを保持した、特殊なオブジェクトなのです。

これは、料理に例えるなら「1から100までの数字が書かれた本」(リスト)と、「1から100まで数える、という手順が書かれたレシピ」(rangeオブジェクト)の違いのようなものです。

レシピはたった数行で済みますが、本は100ページ必要ですよね。

rangeはこのレシピ方式なので、たとえrange(100000000)のように非常に大きな範囲を指定しても、メモリをほとんど消費しない、という大きなメリットがあるのです。

もし、どうしてもリストとして中身が見たい、あるいは使いたい場合は、このように変換することができます。

numbers = list(range(5))
print(numbers)
# 出力結果: [0, 1, 2, 3, 4]


まとめと今後の学習

range()関数の基本、いかがでしたか?

ポイントをもう一度おさらいしましょう。

  • range(stop): 0からstopの直前まで
  • range(start, stop): startからstopの直前まで
  • range(start, stop, step): startからstopの直前まで、stepずつ
  • range()はメモリ効率の良いオブジェクトを生成する

range()は、指定した回数だけループを回したいときや、数値のインデックスを使ってリストの要素にアクセスしたいときなど、Pythonプログラミングの様々な場面で活躍する基本中の基本です。

次は、forループの中でインデックス番号と要素を同時に取り出せるenumerate()関数について学んでみると、さらにコードがスッキリ書けるようになりますよ。ぜひ調べてみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。