range型

今回はrange型について解説します。range型は「何に使うのかわからない」「初期化方法が難しい」等、初心者泣かせな変数なのですが制御文等で大活躍する重要な型です。一旦さらりと読み飛ばして戻って再度学習するのも一つの手だと思います。

range型とは

range型とは整数を要素とするイミュータブルなシーケンスを作成するオブジェクトで、組み込み関数のrangeを使用して生成します。整数列のタプルのようなものなのですが、初期化の方法に大きな特徴があります。初期化の際にシーケンスのサイズや、値の範囲、スキップ等を指定することができます。以下、具体的に使ってみることで理解できることと思います。

range型の初期化

まず使ってみる

まず、正確な初期化の構文について学習する前に、とりあえず使ってみましょう。

rng = range(5)
print(rng) # range(0, 5) 中身は一体・・・?
print(list(rng)) # [0, 1, 2, 3, 4]

1行目でrange型を生成しています。range(5)と記述することで、これは、0から5未満までの整数が格納されたシーケンスが生成されます。2行目で生成したオブジェクトをprintで参照していますが、そのままだとrange(0, 5)と表示されて内容がよくわかりません。このため、3行目でlist型に変換して内容を確認しています。list関数の引数にrange型オブジェクトを指定すると、range型からlist型に変換することができますのでそれを利用しているわけです。range型の内容を確認する際によく使用するテクニックです。range型になれるまではlistに変換して中身を確認してみてください。

初期化の構文

range型は組み込み関数のrange関数を使用し生成します。初期化時にさまざまな条件を引数で指定することが可能です。正確には以下の構文で範囲やインクリメントを変えることができます。

初期化
range(stop)
range(start, stop[, step])

startとstopで指定された区間のシーケンスが作成されます。stepで要素間の差を指定します。step引数は省略が可能で、その場合はデフォルト値として1が設定されます。また、マイナスの値を指定することも可能です。最初の例のように引数にstopのみを指定することも可能でその場合は0始まりのrangeとなります。

それではここからさらにサンプルを確認してみましょう。サンプルでは先程と同様、rangeの中を確認するために一旦リストに変換してからprintで出力しています。

r1 = range(5)
print(list(r1)) # [0, 1, 2, 3, 4]

r2 = range(1, 5)
print(list(r2)) # [1, 2, 3, 4]

r3 = range(1, 5, 2)
print(list(r3)) # [1, 3]

r1は、0から5個の整数シーケンスが生成されています。1づつ大きくなっています。
r2は、1から5個の整数シーケンスが生成されています。1づつ大きくなっています。
r3は、1から5個の整数シーケンスが生成されています。2づつ大きくなっています。

for文での利用

rangeの使い道ですが、最初はlistの初期化とループで利用することが多いかと思います。PythonではC言語やJavaのようにループカウンタを指定したfor文がないため、同じような書き方をしたい場合はrangeを利用します。(for文についてはこちらで説明します。)

javaでカウンタを指定したfor文を使用する場合、以下のように記述します。

// javaのfor文
for(i = 0; i < 10; i++){
    // 処理

これをPythonに書き直すと、以下のようになります。

# Pythonの場合
for i in range(0, 10):
    # 処理

もっとも、Pythonではlistのようなイテラブルなオブジェクトについてはカウンタを考慮せずにfor文を使用できるので、上のようなループはあまり使用されません。