range関数
等差数列を生成するためのrange型オブジェクトを生成するビルトイン関数。ループ回数の管理や添字への利用を目的としているため、以下の特徴を有する。
数列は整数で構成されている
range型オブジェクトはイタレブルである。リストのように数列の全ての要素を保持しているわけではなく、rangeオブジェクトを呼び出す度に必要な値を生成する。
for文のループ制御にイタレブルなオブジェクトを与えると、先頭から終端要素までの要素を値が取り出される。
code:python
loops = 1, 2, 3, 4
for i in loops:
print(i)
このやりかたでは、ループ回数の増加に比例してそれを制御するためのイタレブルオブジェクトのサイズが増加するためメモリ負荷が高い。そこで、range型オブジェクトが用意されている。これは呼び出す度に必要な値を1つ生成する。
code:python
loops = range(10)
for i in loops:
print(i)
range関数を実行すると、range型オブジェクトが生成される。なので、rangeオブジェクトをprintしても数列は表示されない。
code:python
loops = range(10)
print(loops)
オブジェクトに添字を与えると、対応する値を得ることができる。
code:python
loops = range(10)
print(loops2)
上記の例とは異なり、一般にrange型オブジェクトは次のようにfor文に直接与えられる。
code:python
for i in range(10):
print(i)
引数が1個の場合、終端要素を指定する。
code:python
range(end)
# 結果:数列:0, 1, 2, ...end - 1が生成される
endの1つ手前で終わることに注意。つまり、数列は0から始まるので引数endは「終端要素」というよりも「出力する要素の個数」と捉えた方が適切。
引数が2個の場合、第1引数が先頭要素となる。
code:python
range(start, end)
# 数列:start, start+1, ..., end-2, ...end-1
引数が3個の場合、上のケースに加えて第3引数が数列の刻み幅となる。
code:python
range(start, end, step)
# 数列:start, start+step, start+step*2, ..., end-step*2, end-step
終端要素の扱いなど説明が複雑になるので実際に自身で試して理解してください。
リストやタプルにキャストすると、全ての値を取り出すことができる。
code:python
x = range(10)
y = list(x)
z = tuple(x)
print(y)
print(z)
# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
リスト内包表記のような使い方もできる。
code:python
x = list(range(10, 20, 2))
print(x)
# 10, 12, 14, 16, 18