今回は、Pythonのrange関数でfloatを使う方法についてご紹介します。
Pythonにはrangeという組み込み関数が用意されており、連続した整数のリストを簡単に生成できます。
しかし、その名の通りrange関数は整数値のみを扱う仕様になっています。
そのため、そのままfloat(浮動小数点数)を指定するとエラーが発生するケースがあります。
この記事では、Pythonのrange関数でfloatを使おうとした際によく起こるエラーと、浮動小数点数の範囲を生成するためのいくつかの方法をご紹介します。
range関数とは
range関数は、指定した範囲の整数を順番に生成するイテレータを返す関数です。
一般的には、以下のように3つの引数(start, stop, step)を渡して使用します。
1 2 |
for i in range(0, 5, 1): print(i) |
0
1
2
3
4
この場合、0から4までの整数が順番に出力されます。
ところが、rangeは整数専用のため、たとえば以下のようにfloatを指定するとエラーが出ることがあります。
floatを指定するとどうなるか
試しに、次のコードを実行してみます。
1 2 |
for i in range(0.0, 5.0, 1.0): print(i) |
このコードを実行すると、以下のようなエラーが発生します。
TypeError: ‘float’ object cannot be interpreted as an integer
これは、rangeが整数専用であるため、floatを渡したときに解釈できずにエラーを出しているのです。
Pythonでfloatの範囲を扱う3つの方法
ここからは、floatの範囲を扱うために利用できる3つの方法をご紹介します。
いずれもrangeそのものではなく、別のアプローチでfloatを生成する点が特徴です。
1. カスタムジェネレータを作成する
自分で関数を定義して、whileループとyieldを使いながら値を返す方法です。
1 2 3 4 5 6 7 8 |
def frange(start, stop, step): current = start while current < stop: yield current current += step for num in frange(0.0, 1.0, 0.2): print(num) |
0.0
0.2
0.4
0.6
0.8
上記のように、自作のfrange関数を用意すれば、任意のfloat区間をシンプルに扱うことができます。
ただし、stepを0にすると無限ループに陥る恐れがあるため、入力値のチェックが必要です。
2. リスト内包表記と整数のrangeを組み合わせる
もう一つの方法は、まず整数のrangeでループ回数を管理し、そこにstepをかけることでfloatを生成する方法です。
1 2 3 4 5 6 7 |
start = 0.0 stop = 1.0 step = 0.2 count = int((stop - start) / step) float_values = [start + i * step for i in range(count)] print(float_values) |
[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]
浮動小数点数特有の丸め誤差が出ることがありますが、単純に値を生成するには便利な方法です。
3. NumPyの関数を使用する
NumPyと呼ばれる数値計算ライブラリを導入すると、さらに便利な関数が利用できます。
1 2 3 4 5 6 7 8 9 |
import numpy as np # np.arangeを使う方法 values_arange = np.arange(0.0, 1.0, 0.2) print(values_arange) # np.linspaceを使う方法(生成数を指定) values_linspace = np.linspace(0.0, 1.0, num=5, endpoint=False) print(values_linspace) |
[0. 0.2 0.4 0.6 0.8]
[0. 0.2 0.4 0.6 0.8]
np.arangeはstart、stop、stepを指定して任意のfloat範囲を生成できます。
np.linspaceはstartとstopを含めて、等間隔の値を指定した数だけ生成します(endpoint=Falseで末端を除外する設定も可能)。
これらの機能を使う際は、別途NumPyのインストールが必要です。
まとめ
Pythonのrange関数は整数専用なので、floatを扱う際には別の方法を使います。
カスタムジェネレータ、リスト内包表記、またはNumPyを使うことで簡単にfloatの範囲を生成できます。
用途や必要とする精度・性能に合わせて、適切な方法を選んでみてください。