今日の記事では、Python 2.xのrange(), xrange()について解説いたします。
range()、xrange()はループ処理をする際の繰り返し回数を指定したり、繰り返しの値をリストに格納したい時に使ったりする関数です。
「for文を書きたいんだけど、ループ処理ってどうやってやれば良いんだろう…」
「(x)range()の使い方がわからない」
「(x)range()を使おうとしたらエラーが出た」
とお悩みの方に向けて、
【基礎】range(), xrange()とは
【基礎】range(), xrange()の使い方
【応用】range()とxrange()の違い
【応用】python3系とxrane()について
を説明いたします。
range(), xrange()はpythonのループ処理でよく出るので、ぜひここで概要と使い方を覚えていってください。
なお、「python3系でxrange()が使を使おうとしたらエラーが出てしまった。」という問題を抱えておられる方、結論から申しますとpython3系ではxrange()を使う事はできません。
問題をお急ぎで解決させたい方は「python3系とxrange()について」で言及していますので、参照してみてください。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
range(), xrange()とは
まずはじめに、range(), xrange()について解説致します。
range()はサンプルコードでfor文やlistなどで登場する、連続した数のリストを返す関数です。
一方xrange()は、連続した数のオブジェクトを返す関数です。
非常によく似ていますね。
その違いは、range()はリストを返し、xrange()はイテレータを返すところにあります。
詳細については後の「range()とxrange()の違い」で言及致します。
range(), xrange()の使い方
それでは、実際にrange(), xrange()の使い方を確認しましょう。
使い方はどちらも同じで、以下のようになります。
# 以降のコードはPython 2.7などの2.x系で動作します。 for i in range(0, 5, 1): print i for i in xrange(0, 5, 1): print i
3つ引数が登場していますね。
1つ目の引数は、繰り返しの開始となる値
2つ目の引数は、繰り返しの回数
3つ目の引数は、増加(減少)する量
を意味しています。
また、第2引数(繰り返し回数)以外は省略可能で、省略した場合開始の値は0となり、1ずつ増加します。
上記の例では3つとも指定していますが、繰り返しの内容を言葉で表現すると、「初めに0を返し、1ずつ増えて合計5回値を返す」となります。
実行結果は以下になります。
実行結果:
0 1 2 3 4 0 1 2 3 4
なお、小数を指定することはできないのでご注意ください。
range()とxrange()の違い
range(), xrange()の使い方がわかった所で、この2つの関数の違いについて詳しく説明いたします。
「range(), xrange()とは」で述べた通り、この2つの関数は戻り値となるオブジェクトが異なる点が違います。
range()がリストを返し, xrange()はイテレータと呼ばれるxrange()オブジェクトを返します。
実際に確認してみましょう。
print(type(range(10))) print(type(xrange(10)))
type()はオブジェクトの種類を返す関数です。
実行結果は以下のようになります。
<type 'list'> <type 'xrange'>
range()がリストを、xrange()がxrange()オブジェクトを返しているのが分かりますね。
これらの違いは、ループ処理をした時のメモリ負荷を考えた時に出てきます。
例えばループで1000000回といったループをする際、range()でループをしようとすると、range()はまずはじめに0から999999の値を格納したリストを作ってしまいます。
これではメモリに負荷をかけてしまいますね。
それを解決するのが、xrange()です。
xrange()はイテレータといって、次の要素にアクセスすることを繰り返すインターフェースを返しています。
これにより、逐次処理ができるようになり、初めに膨大なメモリを確保しなくても良くなりました。
もしイテレータについて細かく知りたい方がいらっしゃいましたら、以下のページをご参考にしてください。
また、ループ処理は必ずしも指定した回数を繰り返すとは限りません。
処理によっては途中でループ処理をbreak(中断)する場合もしばしばあります。
途中で中断される可能性のある処理ではなおさら、初めに全ての値を持っておく必要はないですよね。
そんな理由から、xrange()を使う方が勧められています。
さらに、処理速度もxrange()の方が早いです。
実際に確認してみましょう。
import time loop = 1000000 loop_break = 800000 def range_loop(array): sum = 0 start = time.time() for i in range(array): sum += i if i == loop_break: break fin = time.time() return(fin - start) def xrange_loop(array): sum = 0 start = time.time() for i in xrange(array): sum += i if i == loop_break: break fin = time.time() return(fin - start) time_range = range_loop(loop) time_xrange = xrange_loop(loop) print time_range print time_xrange
実行結果:
3.78179597855 3.70990586281
python3系とxrange()について
ここまでrange(), xrange()について述べてきましたが、python3系ではxrange()を使う事はできません。
print(xrange(10))
これをpython3で実行しようとすると、
NameError: name 'xrange' is not defined
このようにエラーとなってしまいます。
これは、python3系ではxrange()関数が削除されている為です。
xrange()はメモリ節約、処理速度の観点で共にrange()より優れているので、python3系ではxrange()の処理をrange()として採用し、xrange関数を削除しています。
その為python3系ではxrange()呼び出しができません。
もし「NameError: name ‘xrange’ is not defined」と出てきた場合は、これが原因となります。
python3ではrange()のみ呼び出し可能と覚えましょう。
まとめ
いかがでしたでしょうか?
今回の記事では、
【基礎】range(), xrange()とは
【基礎】range(), xrange()の使い方
【応用】range()とxrange()の違い
【応用】python3系とxrane()について
について解説いたしました。
ループ処理はコーディングする上で頻繁に出てくるので、range(), xrange()はとても重要です。
ここで使い方を覚えて、ぜひループ処理マスターとなってください!