今更ながら分数を扱うPythonビルトインのfractionsパッケージという存在を知ったので、どんな挙動をするものなのかを軽く調べておきます。
記事内で使う環境
Python 3.8.6を使います。残りはビルトインのfractionsパッケージだけ使っていきます。
基本の使い方
まずは扱うためにfractionsパッケージのimportが必要になります。特にFractionクラスが利用のメインとなるため、そちらをimportします。
from fractions import Fraction
Fraction(分数)クラスはnumerator(分子)という第一引数とdenominator(分母)という第二引数を受け付けます。
f = Fraction(numerator=3, denominator=4)
インタラクティブシェルやJupyter上でFractionクラスのインスタンスを表示してみると、分子と分母の値を含んだ形でrepr的に表示されます。
>>> f
Fraction(3, 4)
print関数を通してみると、3/4
といったような形で表示されます。
>>> print(f)
3/4
intやfloatとの比較ができる
Fractionインスタンスはそのままintやfloatと比較ができるようです。
>>> f = Fraction(numerator=4, denominator=4)
>>> f == 1
True
>>> f = Fraction(numerator=3, denominator=4)
>>> f == 3 / 4
True
intの値であれば四則演算してもFractionが返る
Fractionのインスタンスに対してintなどで四則演算した場合はそのままFractionのインスタンスが返ります。
>>> Fraction(3, 4) + 1
Fraction(7, 4)
>>> Fraction(5, 4) - 1
Fraction(1, 4)
>>> Fraction(3, 4) * 2
Fraction(3, 2)
Fraction同士の四則演算もFractionが返る
Fraction同士を加算したりすると結果もFractionのインスタンスになります。
>>> Fraction(1, 4) + Fraction(1, 4)
Fraction(1, 2)
Fraction + Fraction + intみたいな計算でもFractionがそのまま返ります。
>>> Fraction(1, 4) + Fraction(1, 4) + 1
Fraction(3, 2)
floatの値で四則演算するとfloatが返る
Fractionとfloatの値で四則演算すると結果はfloatになります。
>>> Fraction(3, 4) + 1.5
2.25
分母(denominator)の引数は省略できる
第一引数の分子(numerator)の引数にfloatを指定することで、分母のdenominator引数を省略してもFractionインスタンスを作ることができます。
>>> Fraction(numerator=0.25)
Fraction(1, 4)
>>> Fraction(numerator=0.26)
Fraction(1170935903116329, 4503599627370496)
>>> 1170935903116329 / 4503599627370496
0.26
numerator引数には文字列も指定できる
1/4
といったような、半角のスラッシュを使った文字列もnumerator引数に指定することができます。
>>> Fraction(numerator='1/4')
Fraction(1, 4)
自動で約分される
Fractionのインスタンスを作ったり計算などをした際に約分できる場合には約分が自動で実行されます。
>>> Fraction(2, 4)
Fraction(1, 2)
>>> Fraction(1, 6) + Fraction(1, 6)
Fraction(1, 3)
limit_denominator メソッドで無理数の近似の値を取得することができる
無理数を指定した場合などに、最大の分母の値(max_denominator引数)を指定することで、その値以下になる範囲で近似値を取得することができます。
>>> Fraction(3.14159265359)
Fraction(3537118876014453, 1125899906842624)
>>> Fraction(3.14159265359).limit_denominator(max_denominator=10)
Fraction(22, 7)
>>> 22 / 7
3.142857142857143
>>> Fraction(3.14159265359).limit_denominator(max_denominator=150)
Fraction(3.14159265359).limit_denominator(max_denominator=150)
>>> 355 / 113
3.1415929203539825