range()
pythonのrange()の使い方
python3では、rangeは0から始まり、指定値未満の連続整数を生成するジェネレータを返す。
要素を確認したいときはlist(range(3))などとする。
type(range(3)) #class 'range' range(3) #range(0, 3) range(3.5) #TypeError :小数は扱えない list(range(3)) #[0, 1, 2] list(range(0)) #[] 空のリスト list(range(-1)) #[] 空のリスト
開始値の指定やstep(公差)を指定できる。
list(range(1, 6)) #[1, 2, 3, 4, 5] list(range(1, 6, 2)) #[1, 3, 5] stepが2 list(range(5, 1)) #[] list(range(-5, 0)) #[-5, -4, -3, -2, -1] list(range(5, 0, -1) #[5, 4, 3, 2, 1] list(range(0, 5, -1) #[]
存在判定、スライス、len()など、
結合・繰り返し以外のシーケンス演算が使える。
list(range(5)[2:4]) #[2, 3] range(5)[::-1] #range(4, -1, -1) len(range(0, 10, 3) #4 4 in range(10) #True
for i in range(len(list)):
for i in range(len(string)):
などでよく使う。
代入もできる
r = range list(r(3)) #[0, 1, 2] r = range(3) list(r) #[0, 1, 2]
ジェネレータどうしは連結できないけど、リスト化すればできる。
range(3) + range(3, -1, -1) #TypeError:rangeどうしは足せない list(range(3)) + list(range(3, -1, -1)) #[0, 1, 2, 3, 2, 1, 0]
range()で小数を扱いたいときはジェネレータを自作する。
あるいはnumpyのlinspaceを使うなど。
#ジェネレータ内包表記 g = (i * 0.1 for i in range(11)) #ジェネレータ関数を作る def frange(start, stop, step): while start< stop: yield start start += step raise StopIteration print("frange:", list(frange(0, 1, 0.1))) #numpyのlinspaceを利用する import numpy as np g = (i for i in np.linspace(0, 1, 11)) #0から1まで10等分。ただし右端の1も含む。
誤差の出現を減らすためには、整数が使える範囲は整数で扱い、必要になってから小数にする方法がよさげ。