Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

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も含む。

誤差の出現を減らすためには、整数が使える範囲は整数で扱い、必要になってから小数にする方法がよさげ。