【Python】range型の基本と使いかたについて

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]
  • 引数start, stop, stepを設定した場合
  • >>> list(range(1, 10, 2))
    [1, 3, 5, 7, 9]
  • 引数start, stop, stepの数値の大小関係が矛盾した場合は空が返ります
  • >>> list(range(5, 10, -1))
    []
  • 引数stepをマイナスにするとカウントを逆回しに出来ます。start, stopの値設定に注意!
  • >>> list(range(5, 0, -1))
    [5, 4, 3, 2, 1]
  • 引数stepを省略した場合は(デフォルト値)step = 1となります。
  • >>> list(range(1, 5))
    [1, 2, 3, 4]
  • 引数step = 0とするとValueErrorが返ります。
  • >>> 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型についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

[Sponsor link]