利用標(biāo)準(zhǔn)庫(kù)fractions模塊讓Python支持分?jǐn)?shù)類型的方法詳解
前言
你可能不需要經(jīng)常處理分?jǐn)?shù),但當(dāng)你需要時(shí),Python的Fraction類會(huì)給你很大的幫助。本文將給大家詳細(xì)介紹關(guān)于利用標(biāo)準(zhǔn)庫(kù)fractions模塊讓Python支持分?jǐn)?shù)類型的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:
fractions模塊
fractions模塊提供了分?jǐn)?shù)類型的支持。
Fraction類
該類是fractions模塊的核心,它繼承了numbers.Rational
類并且實(shí)現(xiàn)了該類所有的方法。
構(gòu)造函數(shù)并不復(fù)雜:
class fractions.Fraction(numerator=0, denominator=1) class fractions.Fraction(int|float|str|Decimal|Fraction)
可以同時(shí)提供分子(numerator)和分母(denominator)給構(gòu)造函數(shù)用于實(shí)例化Fraction類,但兩者必須同時(shí)是int類型或者numbers.Rational
類型,否則會(huì)拋出類型錯(cuò)誤。當(dāng)分母為0,初始化的時(shí)候會(huì)導(dǎo)致拋出異常ZeroDivisionError。
而如果只提供一個(gè)參數(shù),則可以用上述五種類型進(jìn)行初始化。當(dāng)使用字符串進(jìn)行初始化時(shí),fractions模塊使用內(nèi)置的正則表達(dá)式進(jìn)行匹配。而使用浮點(diǎn)數(shù)或者Decimal進(jìn)行初始化時(shí),fractions模塊會(huì)在內(nèi)部調(diào)用as_integer_ratio()
。
下面的代碼示例來自官方文檔,展示了各種實(shí)例化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)
有時(shí)候?qū)⒏↑c(diǎn)數(shù)或者Decimal作為Fraction實(shí)例的初始化數(shù)據(jù)可能會(huì)遇到舍入誤差的問題,如上面調(diào)用Fraction(1.1)
時(shí)不返回Fraction(11, 10)
的例子。這時(shí)Fraction類提供了一個(gè)實(shí)例方法limit_denominator()
用于減小這種誤差。這個(gè)方法本來是為了通過限制分母來得到一個(gè)近似值,但是在出現(xiàn)舍入誤差的時(shí)候反倒使得結(jié)果更加精確了,如下面的例子:
>>> from fractions import Fraction >>> Fraction(1.1) Fraction(2476979795053773, 2251799813685248) >>> Fraction(1.1).limit_denominator() Fraction(11, 10)
將Fraction用于算術(shù)運(yùn)算、關(guān)系運(yùn)算和其他多種操作
上面提到,F(xiàn)raction類繼承了numbers.Rational
類并且實(shí)現(xiàn)了該類所有的方法。所以Fraction類事實(shí)上通過重載很多特殊函數(shù),使得其實(shí)例可以直接用于多種算術(shù)運(yùn)算。
不僅支持算術(shù)運(yùn)算,F(xiàn)raction類同時(shí)也支持關(guān)系運(yùn)算、pickle模塊、copy模塊和哈希值的計(jì)算。
>>> 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
其他函數(shù)
fractions.Fraction.from_float(flt) fractions.Fraction.from_decimal(dec)
在Python3.2之前,F(xiàn)raction類不支持通過將浮點(diǎn)數(shù)和Decimal傳入構(gòu)造方法來獲得實(shí)例。而是提供了上面兩個(gè)類方法,通過調(diào)用類方法的方式來產(chǎn)生實(shí)例,目前版本(Python 3.6.1)這兩個(gè)類方法仍然存在。
fractions.gcd(a, b)
用于計(jì)算最大公約數(shù)。這個(gè)函數(shù)在Python3.5之后就廢棄了,官方建議使用math.gcd()
。
總結(jié)
沒啥要總結(jié)的…只能說Python太方便了…對(duì)了,這篇博客其實(shí)也是個(gè)挖了挺久的坑了,之前里面有一部分源碼沒看懂所以一直沒發(fā)上來。哈哈,后面這個(gè)標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)的系列還是會(huì)一直更下去的!
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
參考資料:
相關(guān)文章
一文詳解Python中多進(jìn)程和進(jìn)程池的使用方法
這篇文章將介紹Python中多進(jìn)程和進(jìn)程池的使用方法,并提供一些實(shí)用的案例供大家參考,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)在字典中將鍵映射到多個(gè)值上的方法
這篇文章主要介紹了Python在字典中將鍵映射到多個(gè)值上的方法,涉及Python針對(duì)字典的相關(guān)映射與初始化相關(guān)操作技巧,需要的朋友可以參考下2018-02-02Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐
本文主要介紹了Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Python報(bào)錯(cuò)error: subprocess-exited-with-error解決辦法
在Python開發(fā)中,遇到subprocess-exited-with-error通常是由依賴缺失、權(quán)限問題、環(huán)境配置錯(cuò)誤或兼容性問題導(dǎo)致,修復(fù)方法包括安裝依賴、使用虛擬環(huán)境、提升權(quán)限、檢查路徑和命令,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10