Pythonのrange関数を使ったfor文の書き方

Pythonのrange関数を使ったfor文の書き方
目次

Pythonでは他のプログラミング言語と比べて、ユーティリティ関数の実装が多くあります。 今回はその中でもPythonの range() 関数を使ったfor文の処理を紹介します。

動作環境

今回は以下の環境にて動作確認をしています。

  • Python 3.8

range()関数とは

range() は数列を作るために用いるPythonの組み込み関数です。 主にfor文と組み合わせて使います。

range() 関数には引数の与え方がいくつかあり、それによって生成する数列のルールを制御します。

range()関数の使い方

range()関数に引数を1つあたえて、0始まりの数列を生成する

まずは一番基本となる使い方です。 range() 関数に整数値の引数を1つ与えましょう。

以下では range(5) を呼び出しています。 引数を1つ与えた場合には 0 を始まりとして、引数に与えた数 - 1(今回だと4) までの数列を関数が生成することを確認できます。

1for i in range(5):
2    print(i)
3
4> 0
5> 1
6> 2
7> 3
8> 4

range()関数に引数を2つあたえて、任意の数字始まりの数列を生成する

range() 関数に整数値の引数を2つ与えた場合には、 第1引数の数字 を始まりとして、第2引数に与えた数 - 1 までの数列を生成できます。

1for i in range(2, 5):
2    print(i)
3
4> 2
5> 3
6> 4

range(0, N) とすると range(N) と等価になります( N は任意の整数値)

1# range(5)と等価
2for i in range(0, 5):
3    print(i)
4
5> 0
6> 1
7> 2
8> 3
9> 4

また、第1引数の値よりも第2引数の値が大きい必要があります。 内部的には暗黙的に1ずつ加算していくため、よしなに1ずつ減算する振る舞いはしてくれません。

1# 数列が生成されない例
2for i in range(10, 0):
3    print(i)
4
5>

range()関数に引数を3つあたえて、任意の数字始まりかつ任意の加算ステップの数列を生成する

range() 関数に整数値の引数を3つ与えた場合には、 第1引数の数字 を始まりとして、第2引数に与えた数 - 1 までの数列を 第3引数の数字刻みで 生成できます。

以下では2から8までの整数値の間で2ずつ加算していく数列を作っています。

1for i in range(2, 8, 2):
2    print(i)
3
4> 2
5> 4
6> 6

第3引数に負の整数を与えれば減算する数列を作ることもできます。

1for i in range(5, 0, -1):
2    print(i)
3
4> 5
5> 4
6> 3
7> 2
8> 1

残念ながら、少数を扱う数列は生成できません。

1for i in range(1, 5, 0.2):
2    print(i)
3
4> TypeError: 'float' object cannot be interpreted as an integer

リスト内包表記と組み合わせて使う

range() 関数とリスト内包表記を組み合わせて、数値配列を初期化することもできます。

1arr = [i for i in range(1, 10, 3)]
2print(arr)
3
4> [1, 4, 7]

range()関数を使うメリット

数列を簡単に生成できる range() 関数ですが、 range() 関数で生成されるオブジェクトは 数字の格納された配列ではありません 。 以下では range クラスオブジェクトの存在を確認できます。

1hoge = range(1, 10)
2print(hoge)
3
4> range(1, 10)
5
6print(type(hoge))
7
8> <class 'range'>

Pythonの公式サイト でもその旨が記載されています。 以下、引用です。

range() が返すオブジェクトは、いろいろな点でリストであるかのように振る舞いますが、本当はリストではありません。これは、イテレートした時に望んだ数列の連続した要素を返すオブジェクトです。しかし実際にリストを作るわけではないので、スペースの節約になります。

なるほど、数値のリストを自前で作るよりもメモリ効率が良いということですね。

参考にさせていただいたサイト