スライドショー

【これでループ処理も安心!】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()について」で言及していますので、参照してみてください。

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入門】イテレータの使い方を解説
更新日 : 2018年10月18日

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

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

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

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

遠藤貴大

遠藤貴大

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