【これでループ処理も安心!】pythonのrange, xrange使い方まとめ

今日の記事では、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の記事については、こちらにまとめています。

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()はイテレータといって、次の要素にアクセスすることを繰り返すインターフェースを返しています。

これにより、逐次処理ができるようになり、初めに膨大なメモリを確保しなくても良くなりました。

もしイテレータについて細かく知りたい方がいらっしゃいましたら、以下のページをご参考にしてください。

【Python入門】イテレータの使い方を解説
更新日 : 2022年7月28日

また、ループ処理は必ずしも指定した回数を繰り返すとは限りません。

処理によっては途中でループ処理を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()はとても重要です。

ここで使い方を覚えて、ぜひループ処理マスターとなってください!

[programing_basis]

\業界最安級/
月額1,980円のプログラミングスクール

✔ 業界最安値の月定額1,980円
✔ 「Q&A掲示板」で平均30分以内に回答がもらえる
✔ 月に一度の「オンライン相談」で悩みを解決
✔ 教材の数は40種類以上
✔ 入会金不要+いつでも退会OK

詳しくはこちら

Writer

遠藤貴大

株式会社SAMURAI

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close