ホームページ  >  記事  >  バックエンド開発  >  Python で分数型をサポートする方法の詳細な説明 (標準ライブラリの分数モジュールを使用)

Python で分数型をサポートする方法の詳細な説明 (標準ライブラリの分数モジュールを使用)

黄舟
黄舟オリジナル
2017-08-11 14:04:403610ブラウズ

最近仕事で分数処理に遭遇し、関連情報を検索したところ、Fraction クラスを使用して実装できることがわかりました。そこで、次の記事では主に、Python で分数型をサポートするための標準ライブラリの分数モジュールの使用に関する関連情報を紹介します。この記事ではコードの紹介が非常に詳細に行われているので、必要な場合は参考にしてください。

はじめに

分数を扱う必要はあまりないかもしれませんが、その場合は、Python の Fraction クラスが大いに役立ちます。この記事では、Python で分数型をサポートできるようにするための標準ライブラリの分数モジュールの使用法について詳しく説明し、参考と学習のために共有します。以下では多くを説明しません。詳細な紹介を見てみましょう。 :

fractionsモジュール

fractionsモジュールは、分数型のサポートを提供します。

Fraction クラス

このクラスは、Fraction モジュールのコアであり、numbers.Rational クラスを継承し、このクラスのすべてのメソッドを実装します。 numbers.Rational类并且实现了该类所有的方法。

构造函数并不复杂:


class fractions.Fraction(numerator=0, denominator=1) 
class fractions.Fraction(int|float|str|Decimal|Fraction)

可以同时提供分子(numerator)和分母(denominator)给构造函数用于实例化Fraction类,但两者必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误。当分母为0,初始化的时候会导致抛出异常ZeropisionError。

而如果只提供一个参数,则可以用上述五种类型进行初始化。当使用字符串进行初始化时,fractions模块使用内置的正则表达式进行匹配。而使用浮点数或者Decimal进行初始化时,fractions模块会在内部调用as_integer_ratio()

下面的代码示例来自官方文档,展示了各种实例化Fraction的方式:


>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)

限制分母

fractions.Fraction.limit_denominator(max_denominator=1000000)

有时候将浮点数或者Decimal作为Fraction实例的初始化数据可能会遇到舍入误差的问题,如上面调用Fraction(1.1)时不返回Fraction(11, 10)的例子。这时Fraction类提供了一个实例方法limit_denominator()用于减小这种误差。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了,如下面的例子:


>>> from fractions import Fraction
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)

将Fraction用于算术运算、关系运算和其他多种操作

上面提到,Fraction类继承了numbers.Rational类并且实现了该类所有的方法。所以Fraction类事实上通过重载很多特殊函数,使得其实例可以直接用于多种算术运算。

不仅支持算术运算,Fraction类同时也支持关系运算、pickle模块、copy模块和哈希值的计算。


>>> from fractions import Fraction
>>> x = Fraction(1, 2)
>>> y = Fraction(1, 3)
>>> x + y
Fraction(5, 6)
>>> x - y
Fraction(1, 6)
>>> x * y
Fraction(1, 6)
>>> x / y
Fraction(3, 2)
>>> x ** 2
Fraction(1, 4)
>>> -x
Fraction(-1, 2)
>>> abs(x)
Fraction(1, 2)
>>> round(x)
0
>>> import math
>>> math.floor(x)
0
>>> math.ceil(x)
1
>>> x == y
False
>>> x > y
True

其他函数


fractions.Fraction.from_float(flt) 
fractions.Fraction.from_decimal(dec)

在Python3.2之前,Fraction类不支持通过将浮点数和Decimal传入构造方法来获得实例。而是提供了上面两个类方法,通过调用类方法的方式来产生实例,目前版本(Python 3.6.1)这两个类方法仍然存在。


fractions.gcd(a, b)

用于计算最大公约数。这个函数在Python3.5之后就废弃了,官方建议使用math.gcd()

コンストラクターは複雑ではありません:


rrreeeFraction クラスをインスタンス化するためにコンストラクターに分子と分母の両方を指定できますが、両方とも次の型である必要があります。 int または numbers.Rational を同時に指定しないと、型エラーがスローされます。分母が 0 の場合、初期化中に例外 ZeropisionError がスローされます。 そして、パラメータが 1 つだけ指定されている場合は、上記の 5 つのタイプで初期化できます。文字列で初期化される場合、分数モジュールは組み込みの正規表現マッチングを使用します。浮動小数点数または Decimal で初期化する場合、分数モジュールは内部で as_integer_ratio() を呼び出します。

次のコード例は公式ドキュメントからのもので、分数をインスタンス化するさまざまな方法を示しています: 🎜🎜


🎜rrreee🎜🎜🎜制限分母🎜🎜🎜🎜fractions。 Fraction.limit_denominator(max_denominator=1000000)🎜🎜Fraction インスタンスの初期化データとして浮動小数点数または Decimal を使用すると、Fraction(1.1) の呼び出しなど、丸め誤差の問題が発生する場合があります code> が使用されている場合は、Fraction(11, 10) を返します。現時点では、このエラーを軽減するために、Fraction クラスはインスタンス メソッド limit_denominator() を提供します。このメソッドは元々、分母を制限して近似値を取得することを目的としていましたが、丸め誤差が発生すると、次の例に示すように、実際には結果がより正確になります: 🎜


🎜rrreee 🎜 will Fraction は算術演算、関係演算、その他のさまざまな演算に使用されます。前述したように、Fraction クラスは numbers.Rational クラスを継承し、このクラスのすべてのメソッドを実装します。したがって、Fraction クラスは実際に多くの特殊関数をオーバーロードし、そのインスタンスをさまざまな算術演算に直接使用できるようにします。 🎜🎜Fraction クラスは算術演算をサポートするだけでなく、リレーショナル演算、pickle モジュール、コピー モジュール、ハッシュ値の計算もサポートします。 🎜


🎜rrreee🎜🎜🎜その他の関数🎜🎜🎜


🎜rrreee🎜 Python3.2 より前、Fraction クラスは受け渡しをサポートしていませんでした。浮動小数点数と Decimal がコンストラクターに渡されて、インスタンスが取得されます。代わりに、上記の 2 つのクラス メソッドは、クラス メソッドを呼び出すことでインスタンスを生成するために提供されており、現在のバージョン (Python 3.6.1) にも存在します。 🎜


🎜rrreee🎜 は最大公約数を計算するために使用されます。この関数は Python 3.5 以降では非推奨となり、公式では math.gcd() を使用することが推奨されています。 🎜🎜🎜🎜まとめ🎜🎜🎜🎜 まとめるものが無い…Pythonは便利すぎるとしか言いようがない…ちなみにこのブログ、実は私がずっと掘っていた穴です。以前ソースコードの一部を理解していなかったので、まだ投稿していません。笑、次の標準ライブラリ学習シリーズは引き続き更新されます。 🎜

以上がPython で分数型をサポートする方法の詳細な説明 (標準ライブラリの分数モジュールを使用)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。