【Python】range()関数の使い方を徹底解説!
Pythonで用意されているrange()関数とは、パラメータに指定した開始数から終了数までの連続した数値を要素として持つオブジェクトとなります。
関数となっていますが、実際にはrange型のオブジェクトを作成します。
range()関数はパラメータの個数によって取得する要素数が異なり、1つの場合は0からパラメータの数までのインデックスの範囲を、2つの場合はパラメータ間のインデックスの範囲を、3つの場合は、パラメータ間に間隔をあけてインデックスの範囲を設定することができます。
また、range()関数は+演算子やchain()関数と組み合わせて使用すると複数のインデックスの範囲を指定することができ、for文と組み合わせて使用すると指定したインデックスをまとめて取り出すことができます。
今回は、Pythonのrange()関数の使い方について下記の内容でわかりやすく解説します。
⚫︎ range()関数とは
⚫︎ range()関数の基本的な使い方
⚫︎ range()関数の応用的な使い方
⚫︎ Pyton3とPython2のrange()関数の違い
目次
range()関数とは
range()関数とは、連番や等差数列のリストを取得することができるオブジェクトとなります。
range()は関数となっていますが、実際には range型のオブジェクトを作成します。
range()関数の書き方
range()の構文は下記のようになります。
1 |
range(開始, 終了, 間隔) |
range()関数のパラメータ
range()関数のパラメータは下記のようになります。
・開始:
開始位置をインデックスで指定する。
デフォルトは0。
・終了:
停止する位置をインデックスで指定する。
しかし、終了のパラメータは含まれない。
・間隔:
取得する間隔をインクリメント、デクリメントで指定する。
デフォルトは1。
range()関数のパラメータに、終了のみを指定することで0からスタートし、 終了の番号までを取得することができ、開始と終了を指定することで開始からスタートして、 終了の番号までの範囲を取得することができます。
また、パラメータに、開始、終了、間隔を指定することで開始からスタートし、 終了の番号までを間隔を空けながら取得することができます。
range()関数の基本的な使い方
range()関数は基本的に、リストやタプルなどのインデックスを要素としたイテラブルなオブジェクトを作成する際に使用することができます。
その為、range()関数とリスト(List)を組み合わせた基本的な使い方をサンプルコードを使って解説していきます。
連番の終了のみを設定する
range()で連番の終了のみを設定すると、0からパラメータの数までのインデックスの範囲を設定することができます。
0からスタートして、 終了のパラメータの番号で終了するイメージです。
しかし、終了のパラメータで設定した値は結果に含まれないので注意してください。
また、終了のパラメータを負の値に設定すると空になります。
例
1 2 3 |
print('・連番の終了のみを設定') print(list(range(5))) print(list(range(-3))) |
出力結果
・連番の終了のみを設定
[0, 1, 2, 3, 4]
[]
終了のパラメータを5に設定したので0から4までが出力されています。
また、終了のパラメータを-3に設定したので何も取得できず、空で出力されています。
連番の開始と終了を設定する
range()で連番の開始と終了を設定すると、パラメータ間のインデックスの範囲を設定することができます。
開始のパラメータからスタートして、 終了のパラメータで終了するイメージです
しかし、開始の値は結果に含まれすが、こちらも終了の値は含まれないので注意してください。
また、1ずつ増加する連番なので、開始の値が終了の値よりも大きくなると空になります
例
1 2 3 |
print('・連番の開始と終了を設定') print(list(range(5, 10))) print(list(range(10, 5))) |
出力結果
・連番の開始と終了を設定
[5, 6, 7, 8, 9]
[]
開始のパラメータを5、終了のパラメータを10に設定したので5から9までが出力されています。
また、開始のパラメータを10、終了のパラメータを5に設定したので何も取得できず、空で出力されています。
連番の開始と終了と間隔を設定する
range()で連番の開始と終了と間隔を設定すると、パラメータ間に間隔をあけてインデックスの範囲を設定することができます。
開始のパラメータからスタートして、 間隔のパラメータごとに処理を行い、終了のパラメータの番号で終了するイメージです。
こちらも開始の値は結果に含まれすが、終了の値は含まれないので注意してください。
例
1 2 3 |
print('・連番の開始と終了と間隔を設定') print(list(range(5, 10, 2))) print(list(range(6, 3, 2))) |
出力結果
・連番の開始と終了と間隔を設定
[5, 7, 9]
[]
開始のパラメータを5、終了のパラメータを10、間隔のパラメータを2に設定したので5、7、9が出力されています。
また、開始のパラメータを6、終了のパラメータを3、間隔のパラメータを2に設定したので何も取得できず、空で出力されています。
連番を逆に設定する
range()で連番を逆に設定するにはrange(開始, 終了, 間隔)のようにパラメータである間隔に負の値を指定します。
開始のパラメータからスタートして、 間隔のパラメータごとに減少し、終了のパラメータの番号で終了するイメージです。
そのため開始の値が終了の値よりも大きくなければなりません。
また、開始の値が終了の値よりも小さい場合は空になります。
例
1 2 3 |
print('・連番を逆に設定') print(list(range(9, 2, -2))) print(list(range(2, 9, -2))) |
出力結果
・連番を逆に設定
[9, 7, 5, 3]
[]
開始のパラメータを9、終了のパラメータを2、間隔のパラメータを-2に設定したので9、7、5、3が出力されています。
しかし、開始のパラメータを2、終了のパラメータを9、間隔のパラメータを-2に設定したので何も取得できず、空で出力されています。
range()関数の応用的な使い方
range()関数の応用的な使い方について紹介していきます。
複数のインデックスの範囲を指定する
range()関数で範囲を設定したオブジェクト同士を+演算子で連結させることで「2〜5」と「8〜10」のようにrange()関数で複数の範囲を指定することができます。
例
1 2 3 4 |
print('・range()で複数のインデックスの範囲を指定する') list1 = list(range(2, 5)) + list(range(7, 10)) print(list(list1)) |
出力結果
・range()で複数のインデックスの範囲を指定する
[2, 3, 4, 7, 8, 9]
+演算子で連結させることでrange()関数で複数の範囲を指定することができます。
また、itertoolsライブラリのchain()関数と組み合わせて使用することでも複数の範囲を指定することができます。
例
1 2 3 4 5 |
import itertools print('・chain()で複数のインデックスの範囲を指定する') chain = itertools.chain(range(1, 4), range(12, 25, 2)) print(list(chain)) |
出力結果
・chain()で複数のインデックスの範囲を指定する
[1, 2, 3, 12, 14, 16, 18, 20, 22, 24]
このようにchain()関数とrange()関数で複数の範囲を簡単に指定することができます。
指定したインデックスのみを取得する
range()関数の後ろにインデックスを指定することで指定した範囲の中から番号で取得することができます。
例
1 2 3 4 5 6 7 8 9 |
print('・range()で指定したインデックスのみを取り出す') print(list(range(10))) print(range(10)[2]) print(list(range(1,9))) print(range(1,9)[3]) print(list(range(3,30,2))) print(range(3,20,2)[4]) |
出力結果
・range()で指定したインデックスのみを取り出す
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2
[1, 2, 3, 4, 5, 6, 7, 8]
4
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]
11
このように、range()の後ろにインデックスを指定すると、指定した範囲の中から指定したインデックスの順番の番号を取得しています。
インデックスの範囲をまとめて取り出す
range()関数はfor文と組み合わせて使用することでインデックスの範囲をまとめて取り出すことができます。
例
1 2 3 |
print('・range()で指定したインデックスの範囲ををまとめて取り出す') for j in range(15): print(j) |
出力結果
・range()で指定したインデックスの範囲ををまとめて取り出す
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
このようにfor文の繰り返し処理でrange()で指定したインデックスの範囲をまとめて取得することができます。
range()関数とfor文で繰り返し処理のインデックスの範囲をまとめて取り出す方法について詳しく知りたい場合はこちらをご参考ください。
Pyton3とPython2のrange()関数の違い
このrange()関数は、Python3とPython2で動作が異なります。
まず、Python2には指定された範囲内の数値のリストを生成するrange()とxrange()という2つの関数があります。
range()はリストを返しますが、xrange()はxrange型のオブジェクトを返します。
一方、Python3のrange()関数はオブジェクトを返します。
一度にすべての数値を生成するわけではありません。
Python2の場合
1 2 3 4 5 6 7 |
range1 = range(3) print('・range()関数の場合') print(type(range1)) range2 = xrange(3) print('・xrange()関数の場合') print(type(range2)) |
出力結果
・range()関数の場合
<type ‘list’>
・xrange()関数の場合
<type ‘xrange’>
Python3の場合
1 2 3 |
range1 = range(3) print('・range()関数の場合') print(type(range1)) |
出力結果
・range()関数の場合
<class ‘range’>
Python2のrange()関数はlist型として返し、xrange()関数はrange型として返すようになります。
それに比べて、Python3のrange()関数はrange型のクラスを返します。
つまり、Python2のxrange()はPython3では名前が変更されrange()となり、元のrange()関数は廃止されたということになります。
今回のポイント
range()関数で連番のリストを取得
⚫︎ range()関数とは、連番や等差数列のリストを取得することができるオブジェクトである
⚫︎ range()関数のパラメータに連番の終了のみを設定すると、0からパラメータの数までのインデックスの範囲を設定する
⚫︎ range()関数のパラメータに連番の開始と終了を設定すると、パラメータ間のインデックスの範囲を設定することができる
⚫︎ range()関数のパラメータに連番の開始と終了と間隔を設定すると、パラメータ間に間隔をあけてインデックスの範囲を設置することができる
⚫︎ range()関数で連番を逆に設定する場合はrange()のパラメータである間隔に負の値を指定する
⚫︎range()関数は+演算子やitertoolsのchain()関数と組み合わせて使用することで複数のインデックスの範囲を指定することができる
⚫︎range()関数の後ろにインデックスを指定することで指定した範囲の中から番号で取得することができる
⚫︎range()関数はfor文と組み合わせて使用することで繰り返し処理のインデックスの範囲をまとめて取り出すことができる
⚫︎ Python2のxrange()関数はPython3では名前が変更されrange()関数となり、元のrange()関数は廃止された
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。