首頁  >  文章  >  後端開發  >  如何讓Python支援分數類型(利用標準庫fractions模組)的方法詳解

如何讓Python支援分數類型(利用標準庫fractions模組)的方法詳解

黄舟
黄舟原創
2017-08-11 14:04:403683瀏覽

最近在工作中遇到了分數處理,查找相關的資料發現可以利用Fraction類別來實現,所以下面這篇文章主要給大家介紹了關於利用標準庫fractions模組讓Python支持分數類型的相關資料,文中透過範例程式碼介紹的非常詳細,需要的朋友可以參考下。

前言

你可能不需要經常處理分數,但當你需要時,Python的Fraction類別會給你很大的幫助。本文將給大家詳細介紹利用標準庫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,初始化的時候會導致拋出異常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()

總結

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

以上是如何讓Python支援分數類型(利用標準庫fractions模組)的方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn