[解決!Python]range関数を使いこなすには解決!Python

range関数を使って連番や特定の初期値/最終値/差分で計算される等差数列を得る方法、for文との組み合わせ例、rangeオブジェクトなどについて説明する。

» 2020年11月20日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 0〜9の範囲の連番
r = range(10)
print(list(r))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 0〜9の範囲の連番
r = range(0, 10)
print(list(r))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 7〜11の範囲の連番
r = range(7, 12)
print(list(r))  # [7, 8, 9, 10, 11]

# 初期値1、最終値9、差分2の等差数列:1、3、5、7、9
r = range(1, 10, 2)
print(list(r))  # [1, 3, 5, 7, 9]

# 降順の数列(初期値9、最終値0、差分-1):9、8、7、6、5、4、3、2、1、0
r = range(9, -1, -1)
print(list(r))  # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]


range関数

 Pythonで連続する整数の列や、指定した初期値/最終値/差分で計算される等差数列を得るにはrange関数を使用する。その構文は次のようになっている(なお、実際には数列そのものではなく、その初期値/最終値/差分を示す値を持ったオブジェクトが得られる)。

range(stop)
range(start, stop[, step])


 1つ目の構文は「0〜stop−1」の範囲の整数列を得るために使用する。2つ目の構文は初期値をstart、差分をstepとしたときに「value=start+step×i」(iは0以上の整数値)で計算される等差数列を得るために使用する。差分stepを省略すると、1が指定されたものとして扱われる。いずれの場合も、最終値stopに指定した値自体は整数列には含まれない点には注意しよう。

 実際には、range関数が返すのは今述べたような整数列を表すrangeオブジェクトとなる。以下に例を示す。

r = range(4)
print(r)  # range(0, 4)


 この例では最終値stopだけを指定して、0〜3の整数列(を表すrangeオブジェクト)を得ているが、それをprint関数に渡すと「range(0, 4)」のような出力となる。これはstartの値が0、stopの値が4、stepの値が1の等差数列(連番)を表す。

 実際にこれがどんな値を含んでいるかを調べるにはリストなどに変換するのが簡単だ。

r = range(4)
l = list(r)
print(l)  # [0, 1, 2, 3]


 この結果から、実際の数列には「最終値stopに指定した値−1」までの値が含まれることが分かるはずだ。

0始まりの連番

 既に見たが、0から始まる連番を得るには、最終値だけを指定してrange関数を呼び出せばよい。

r = range(5# 0、1、2、3、4を表すrangeオブジェクト
print(list(r))  # [0, 1, 2, 3, 4]


 最終値stopに指定した値は得られる連番には含まれず、その1つ前の数値までが含まれることも既に述べた通りだ。

 このようにして得たrangeオブジェクトはfor文と組み合わせて、特定の回数の繰り返し処理を行うことがよくある。以下に例を示す。

result = ''
for counter in range(26):  # 0〜25の連番
    result += chr(counter + ord('a'))  # 0〜25の各値を使った処理

print(result)  # abcdefghijklmnopqrstuvwxyz


 上の例は、range関数を呼び出して0〜25の連番を表すrangeオブジェクトを得てから、それをfor文と組み合わせて、最終的に文字列'abcdefghijklmnopqrstuvwxyz'を生成している(効率的ではないだろうが、あくまでも連番を使用した何かの処理をする例ということでご容赦願いたい)。

等差数列

 range関数に2つの引数を指定すると、「初期値start〜最終値stop−1」の範囲の連番を表すrangeオブジェクトが得られる。以下に例を示す。

r = range(0, 5# range(5)と同じ
print(list(r))  # [0, 1, 2, 3, 4]

r = range(5, 10)
print(list(r))  # [5, 6, 7, 8, 9]


 range関数に3つの引数を指定すると、「初期値start〜最終値stop−1」の範囲で差分がstepの等差数列を表すrangeオブジェクトが得られる。以下に例を示す。

r = range(0, 5, 2# start=0、stop=5、step=2
print(r)  # range(0, 5, 2)
print(list(r))  # [0, 2, 4]


 この例ではstart=0、stop=5、step=2を指定してrange関数を呼び出している。返送されるrangeオブジェクトは「range(0, 5, 2)」のように、本稿冒頭の例の出力である「range(0, 4)」とは異なり、差分のパラメーターの値を含んだものとなっている。このrangeオブジェクトが表す数列は「0、2、4」である。

 特定の初期値と差分に従った数列を得て、何らかの処理を行いたいというときには、こちらの呼び出しが使える。例えば、偶数の二乗で構成されるリストがほしいというなら、次のようなコードを書けるだろう。

even_num_powered = [x ** 2 for x in range(2, 9, 2)]
print(even_num_powered)  # [4, 16, 36, 64]


 ここではリスト内包表記とrange関数とを組み合わせて、偶数値2、4、6、8で構成される整数列を基に、その要素を二乗したものを新しい要素とするリストを作成している。

 得られる数列には最終値stopに指定した値が含まれないことはこれまでと同様だ。差分stepに正値を指定した場合、数列に含まれる個々の値は「value=start+step×i」(iは0以上の整数値)のようにして計算できるが、その範囲は「start ≦ value < stop」となる。

r = range(1, 10, 3# start=1、stop=10、step=3
print(list(r))  # [1, 4, 7]


 このコードではstartの値が1、stepの値が3となっているので、得られる数列は1、4、7、10、……のようになるが、stopの値が10なので、これは含まれていないことに注目しよう。

差分に負値を指定

 差分には、負値も指定できる。つまり、5、4、3、2、1、0のような数列も作成できる。以下に例を示す。

r = range(5, -1, -1)
print(list(r))  # [5, 4, 3, 2, 1, 0]


 このときにもstopに指定した値は、結果の数列には含まれないことに注意しよう。差分stepに負値を指定した場合、数列に含まれる個々の値を「value=start+step×i」(iは0以上の整数値)とすると、その範囲は「start ≧ value > stop」となる。

r = range(5, -3, -3)
print(list(r))  # [5, 2, -1]


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。