利用庫fractions模組讓Python支援分數類型

來源:互聯網
上載者:User
最近在工作中遇到了分數處理,尋找相關的資料發現可以利用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模組使用內建的Regex進行匹配。而使用浮點數或者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 + yFraction(5, 6)>>> x - yFraction(1, 6)>>> x * yFraction(1, 6)>>> x / yFraction(3, 2)>>> x ** 2Fraction(1, 4)>>> -xFraction(-1, 2)>>> abs(x)Fraction(1, 2)>>> round(x)0>>> import math>>> math.floor(x)0>>> math.ceil(x)1>>> x == yFalse>>> x > yTrue

其他函數


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太方便了…對了,這篇部落格其實也是個挖了挺久的坑了,之前裡面有一部分源碼沒看懂所以一直沒發上來。哈哈,後面這個標準庫學習的系列還是會一直更下去的!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.