1. 程式人生 > >[Python模組學習]使用標準庫fractions模組使Python支援分數型別

[Python模組學習]使用標準庫fractions模組使Python支援分數型別

fractions模組

fractions模組提供了分數型別的支援。

Fraction類

該類是fractions模組的核心,它繼承了numbers.Rational類並且實現了該類所有的方法。

建構函式並不複雜:

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

可以同時提供分子(numerator)和分母(denominator)給建構函式用於例項化Fraction類,但兩者必須同時是int型別或者numbers.Rational型別,否則會丟擲型別錯誤。當分母為0,初始化的時候會導致丟擲異常ZeroDivisionError。

而如果只提供一個引數,則可以用上述五種型別進行初始化。當使用字串進行初始化時,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()。

總結

沒啥要總結的…只能說Python太方便了…對了,這篇部落格其實也是個挖了挺久的坑了,之前裡面有一部分原始碼沒看懂所以一直沒發上來。哈哈,後面這個標準庫學習的系列還是會一直更下去的!

感謝以上內容提供者!