range型は、Pythonの組込み型の一つで数のイミュータブル(変更不可)なシーケンス型データを表します。forループをある回数だけ回す時などに使われます。今回は、このrangeの使いかたと特徴、およびリストやタプルとの違いも併せてまとめます。
確認した環境
- OS: Ubuntu16.04LTS
- Python3.7.3@Anaconda
range型
特徴
- range型は、数のイミュータブルなシーケンスを表します。
- 一般に for ループにおいて特定の回数のループに使われます。
例えば、”Good!”を5回表示させたい場合は、以下のように書けます。
>>> for _ in range(5):
... print('Good!')
...
Good!
Good!
Good!
Good!
Good!
生成方法
range(start, stop[, step])を使います。
返り値は、rangeオブジェクトです。
>>> a = range(10)
>>> type(a)
<class 'range'>
>>> a
range(0, 10)
rangeオブジェクトはイテラブルなオブジェクトなので、例えばlist()に渡すことでリストへ変換出来ます。下記に具体例を示します。
- 引数が一つしかない場合はstopが適用されます。
※引数stopは設定した値そのものは含まないことに注意!(スライスの指定と同じ)
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]
>>> list(range(5, 10, -1))
[]
>>> list(range(5, 0, -1))
[5, 4, 3, 2, 1]
>>> list(range(1, 5))
[1, 2, 3, 4]
>>> list(range(1, 5, 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: range() arg 3 must not be zero
リスト(list)やタプルとの違い
公式によると、rangeオブジェクトは設定する数値の範囲に関わらず常に一定のメモリしか使わず効率的とのこと。start, stop, stepのみを保存し、必要に応じて生成するため。
リストやタプルは範囲の分だけメモリを食う。
これについて、sys.getsizeof()関数を使って、それぞれのサイズを調べてみました。
>>> import sys
# 0から1,000まで
>>> sys.getsizeof(range(1000))
48
>>> sys.getsizeof(list(range(1000)))
9112
# 0から100,000まで
>>> sys.getsizeof(range(10**5))
48
>>> sys.getsizeof(list(range(10**5)))
900112
確かにrange()は常に一定でリストよりも小さいサイズになっていることが確認できました。
まとめ
今回は、Pythonの組込み型のうち、range型についてまとめました。
コメント
[…] この関数はrange(start, stop, step) で生成されるイテラブルからランダムに抽出された要素を返しています。よって、引数(start、stop、step)は、range()と同じです。 […]