Pythonのrange関数で繰り返し処理を書く方法

プログラミング
Pythonの繰り返し処理について学んでいると必ず出現するのが、range関数。この関数は、範囲を指定して繰り返し処理をおこなうことが可能で、特定の範囲を繰り返し処理することができるので、非常に柔軟に扱うことができる関数です。この記事では、さらに詳しくPythonのrange() と、xrange()の違いについてや、for文での実際の使い方、また、逆ループ関数のやり方について解説しています。
Pythonのrange関数で繰り返し処理を書く方法

Pythonで繰り返し構文を学習していると、必ず出てくるのが range関数 です。
range関数は、連続した数字オブジェクトを作る機能を持った関数で、for文の中で使うことができたり、逆ループで使ったりすることができ、とてもスマートに繰り返しを行うことができる関数です。

今回は、Pythonのrange関数を学習している方に向けて、range関数の使い方などを中心に紹介していきます。

Python2とPython3でのrange()の違い

まず、Pythonには2系と3系がありますが、どちらのバージョンを使って記述するかによって、range関数の使い方は異なります。同じ書き方をしても、Pythonの系統が異なると使えない構文もあるので、注意して使うようにしましょう。

range()とxrange()の違いは?

では、range()とxrange()について解説していきます。

range() とは、for文やリストなどで使われている、連続した数のリストを返す関数です。一方、xrange() は、連続した数のオブジェクトを返してくれる関数のことです。
一見同じ動きをしているように見える range() と xrange() ですが、実は2つには戻り値のオブジェクトが異なるという違いがあります。

range()がリストを返すのに対して、xrange()はイテレータと呼ばれるオブジェクトを返します。

では具体的にどのように使うのか見ていきましょう。Pythonのプログラムで、以下のように書いてみましょう。
※ Python2系で実行してください。理由は後述します。

print(type(range(10))) #range()
print(type(xrange(10))) #xrange()

実行結果

<type 'list'> 
<type 'xrange'>

このように、range()がリストを、xrange()がxrangeオブジェクトを返しているのが分かります。これは、ループ処理をした時のメモリ負荷を考えると分かりやすいです。

例えば、10000回のループをすると仮定した場合、range()でループしようとすると、0から9999の値を格納したリストを作成しています。
xrange()はイテレータを使い、次の要素にアクセスすることを繰り返すインターフェイスとして返しています。これによって、膨大なメモリ負担をかけなくても問題なく処理ができるようになるのです。

Python3ではxrange()が使えない?

大前提として理解しておいて欲しいのが、Pythonの3系ではxrange()を使うことができないということです。

先ほど、xrange()について、膨大なメモリ負担を軽減してくれる役割があるということについて述べました。しかし、Python3系ではこれが削除されてしまったのです。
これは、Python3系がスペックとして劣化した訳ではなく、単純にxrange()の機能を、range()に追加して、range()の機能を拡張したということです。

試しに、Pythonの3系を使って xrange()を実行してみました。

Python 3系

print(type(xrange(10)))

実行結果

Traceback (most recent call last):   
    File "Main.py", line 4, in <module>     
      print(type(xrange(10))) 
NameError: name 'xrange' is not defined

Python 3系で実行した場合、上記のような実行結果になってしまいます。xrange() は関数ごと削除されているので、エラーが出てしまう設計になっています。

Python 3系を利用している方は 、xrange() を使うことが出来ないので注意しましょう。

range関数の使い方は?引数が重要!

では、ここからは、具体的にrange関数の使い方について見ていきます。

冒頭でも説明したように、range関数はfor文を使ってループ処理の回数を想定したり、繰り返しの値をリストに格納したい時に使います。ここでは、基本的な使い方を最初に見てもらったあと、具体的な書き方についても詳しく説明していきます。

基本的な使い方

まずは、range()の基本的な使い方から見ていきましょう。

基本的な使い方として、0から任意の値までの連番を指定して出力する方法があります。
型としては、”range(stop)”とされていて、引数に整数を1つ指定すると、0 〜 stop までの連番が生成されます。

print(list(range(3)))

実行結果

[0,1,2]

これは、3までの連番を生成しています。なお、stopに入っている値は出力されないので注意が必要です。(この場合「3」が出力されていない。)

また、負の値を入れると、空の値が出力されるようになっています。

print (list (range(-3)))

実行結果

[]

for文でのrange関数の使い方

range関数の使い方としては、基本的にfor文などの繰り返し処理に求められることが多いので、基本的には以下のように使います。

for i in range(4):
    print (i)

この場合は、ループ構文の中で ”range(4)” を使うことで、0〜3までの範囲を指定して、”print i” でループ回数分(この場合は4回)出力しています。

実行結果

0
1
2
3

任意の範囲での等差数列でのrange関数の使い方

逆ループをさせる時は、range関数を3つの引数を用いて記述します。
「range(start, stop, step)」という構文になり、「start」部分は開始値、「stop」部分は終了値、「step」部分は増加値という風に形成されていきます。

具体的には以下の例をみて見ましょう。

print (list (range(2, 5, 1 )))

この場合、開始値が2、終了値が5で、増加値が1なので、文脈にすると「2から5までの範囲を1ずつ増加する数値」ということになります。

実行結果

[2.3.4]

もちろん、stepの欄を1ではなく2にすると、2ずつ増加するので、[2,4]が結果となります。

逆ループでのrange関数の使い方

逆ループをさせる時は、先ほどと同様に、range関数を3つの引数を用いて記述します。

逆の場合は、先ほどと少し変化させて、start > stopにして、stepを負の整数にすることで、逆ループをさせることが出来ます。

print (list (range(10, 2, -2 )))

実行結果

[10, 8, 6, 4]

ただ、これだと、いちいちstartとstopの数値を考えなければならないので、非常に手間がかかってしまいます。もっと簡単に表現するためには、組み込み関数の「reversed()」関数を使うと、先ほどの等差数列の増加構文の数字を勝手にひっくり返してくれるので、何も考えずに、非常に簡単にできるのでおすすめです。

print(list(reversed(range(1, 10, 3))))

実行結果

[7, 4, 1]

まとめ

いかがでしたでしょうか?
Pythonで繰り返し処理を行いたい場合、range関数はとても有用な関数です。特定の範囲を指定して繰り返し処理を行うことができるので、とてもスマートに繰り返し処理を行うことができます。

Python プログラミングの中で繰り返し処理が必要な場合は、是非とも活用していきましょう。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム