この記事では、Pythonのxrange()メソッドについて説明します。
xrange() メソッドは Python 2.x バージョンでのみ使用可能で、ループ内でシーケンスを走査または反復するために使用されます。
Python xrange() メソッドの基礎知識
Python の xrange()
メソッドは、ループ処理によく使われる不変のシーケンスである xrange
型のオブジェクトを返します。
これらのオブジェクトはほとんど動作せず、インデックス作成、反復処理、そして len()
関数をサポートするだけです。
xrange(start, stop[, step])
引数の意味は以下の通りです。
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
- start(オプション)は、シーケンス生成の開始点です。これはシーケンスに含まれ、言及されない場合、デフォルトで0に設定されます。
- stop は、シーケンス生成を停止する番号です(排他的)。
-
ステップ(オプション) は、シーケンス生成または反復処理中に関数が取るであろうステップジャンプです。
デフォルトでは、1 の値です。
Python xrange() メソッドの使用法
では、実際にPythonの
xrange()
メソッドをどのように使うか、いろいろ見てみましょう。
1. stopパラメータのみの場合
stepとstartの2つのパラメータはそれぞれデフォルト値が1と0であるため、省略可能です。
したがって、stop パラメータを指定するだけで Python の xrange()
メソッドを使用することができます。
stopだけを指定した場合、xrange()
関数は 0 から (stop-1) までのシーケンスを作成し、step は 1 となります。
以下の例を見てください。
# xrange() with only stop parameter
x = xrange(4)
print"Type of returned object = " , type(x)
print"Sequence generated by xrange() 1 parameter: " , list(x)
結果は以下の通りです。
Type of returned object =
Sequence generated by xrange() 1parameter: [0 , 1 , 2 , 3 ]
ここで,このメソッドが生成するシーケンスの型は,前述のように xrange
型である.xrange()
の出力を list にタイプキャストすると、0から 3(4-1) までの値をステップ 1 で含むリストが生成されます。
2. startとstopのパラメータ付き
同様に、Pythonの xrange()
メソッドに2つのパラメータを指定して使用することもできます。
この場合、デフォルトでは step
は値 1 を持ちます。
# xrange() with start & stop parameters
x = xrange(2 , 9)
print"Type of returned object = " , type(x)
print"Sequence generated by xrange() 2 parameters: " , list(x)
結果は以下の様になります。
Type of returned object =
Sequence generated by xrange()2parameters: [2 , 3 , 4 , 5 , 6 , 7 , 8 ]
上の出力からわかるように、今回のPythonの xrange
オブジェクトは、デフォルトのステップ 1. で 2(start) から 8(stop-1) までの値が入っています。
3. スタート、ストップ、ストップ値すべてで
すべてのパラメータを記載すると、Pythonの xrange()
関数は、先ほどの場合と同じように start から stop-1 までの値を持つ xrange
オブジェクトを生成します。
しかし今回は、ある要素から別の要素へのジャンプは、渡された step
と同じになります。
下の例をよく見てください。
ここでは、ステップを 5 、 start=5 、 stop=40 と考えています。
# xrange() with 3 parameters
x = xrange(5 , 40 , 5)#positive step
y = xrange(9 , 1 , - 1)#negative step
print"Sequences generated for 3 parameters by xrange"
print"x : " , list(x)
print"y : " , list(y)
結果は以下の通り。
Sequences generated for 3 parameters by xrange
x : [5 , 10 , 15 , 20 , 25 , 30 , 35 ]
y : [9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 ]
出力から、シーケンスは 5 から 39(40-1) までの値で生成されていることがわかる。
最後の要素については、40が「stop-1」のマークを超えているため、.とはみなされない。
Pythonのxrange()をループで使用する
先に述べたように, Python 2 では, xrange()
が forループ構造で広く利用されています.例えば、以下のコードでは、数 10 のテーブルを表示しようとしています。
# using xrange in loops
print"Table of 10: "
for i in xrange(10 , 101 , 10):
print i
結果は以下の通りです。
Table of 10:
10
20
30
40
50
60
70
80
90
100
ここでは、 start=10
, stop=101
, step=10
と記述しています。
100(100-1) の要素を含むシーケンスにしたいので、stop は 101 としました。
見ての通り、10から100までのすべての10の倍数が得られます。
従って、出力は正当です。
Python xrange() vs range()
通常、xrange() は、Python 3.x では使用できないため、Python 2.x 用にのみコードを設計したい場合にのみ使用されます。
Python 3 では、 range()
メソッドが xrange()
メソッドに取って代わります。
この2つの関数の大きな違いは、どちらも異なるプロパティを持つオブジェクトを返すことです。
xrange()
メソッドはイミュータブルなシーケンスである xrange
オブジェクトを返し,前述したように iteration, indexing, len 関数のみをサポートします.
一方, range()
メソッドは, slicing , pop() などの主要な関数をサポートするリストを返します.
# xrange() vs range()
x = xrange(1 , 10)
y = range(1 , 10)
print"Type(x) = " , type(x)
print"Type(y) = " , type(y)
結果は以下の様になります。
Type(x)=
Type(y)=
さらに、 xrange
オブジェクトは、格納する値の範囲に依存せず、かなり一定のメモリサイズを必要とするので、最小限の 空間の複雑さ でコードを構築する必要がある場合に、より有用です。
もし、 Python 2 と 3 の両方で実行できるプログラムを書きたいのであれば、 range()
メソッドを使用することがより理にかなっているので、そちらをお勧めします。