你可能不需要經(jīng)常處理分?jǐn)?shù),但當(dāng)你需要時,Python的Fraction類會給你很大的幫助。在該指南中,我將提供一些有趣的實(shí)例,用于展示如何處理分?jǐn)?shù),突出顯示一些很酷的功能。
1 基礎(chǔ)
Fraction類在Lib/fractions.py文件中,所以可以這樣導(dǎo)入:
1
|
from fractions import Fraction |
有很多種實(shí)例化Fraction類的方法。
首先,你可以傳入分子和分母:
1
2
|
>>> Fraction( 1 , 2 ) Fraction( 1 , 2 ) |
或者利用另一個分?jǐn)?shù)進(jìn)行實(shí)例化:
1
2
3
|
>>> f = Fraction( 1 , 2 ) >>> Fraction(f) Fraction( 1 , 2 ) |
使用一個浮點(diǎn)數(shù)進(jìn)行實(shí)例化:
1
2
|
>>> Fraction( 2.5 ) Fraction( 5 , 2 ) |
或者使用一個 decimal:
1
2
3
|
>>> from decimal import Decimal >>> Fraction(Decimal( '1.1' )) Fraction( 11 , 10 ) |
最后一種方法,可能是最有趣的一種方法,你可以使用一個字符串實(shí)例化Fraction類:
1
2
|
>>> Fraction( '9/16' ) Fraction( 9 , 16 ) |
本質(zhì)上講,F(xiàn)raction類這么設(shè)計,目的就是為了讓你在實(shí)例化該類之前不需要做很多處理。Fraction類知道如何處理多種不同的數(shù)據(jù)類型。
2 自動約分
約分并不是很難,但是對于一些復(fù)雜的分?jǐn)?shù),約分還是要費(fèi)點(diǎn)事的。Fraction類在這方面特別有用,因?yàn)樗茏詣蛹s分分?jǐn)?shù)。
1
2
|
>>> Fraction( 153 , 272 ) Fraction( 9 , 16 ) |
純粹靠想,你可能無法約分153/172,但是Fraction類能很快地完成約分。
3 二元運(yùn)算
你可以像對待整數(shù)和浮點(diǎn)數(shù)一樣,在Fraction對象上執(zhí)行二元運(yùn)算。
兩個分?jǐn)?shù)進(jìn)行相加操作:
1
2
|
>>> Fraction( 1 , 2 ) + Fraction( 3 , 4 ) Fraction( 5 , 4 ) |
這樣操作就很方便了,但是你也可以混合整數(shù)或浮點(diǎn)數(shù)。如你所料,F(xiàn)raction對象和一個整數(shù)進(jìn)行相加返回一個Fraction對象,但和一個浮點(diǎn)數(shù)進(jìn)行相加返回一個浮點(diǎn)數(shù)。
1
2
3
4
|
>>> Fraction( 5 , 16 ) + 3 Fraction( 53 , 16 ) >>> Fraction( 5 , 16 ) + 3.0 3.3125 |
這里有一些其他的二元運(yùn)算的例子:
1
2
3
4
5
6
|
>>> Fraction( 5 , 16 ) - Fraction( 1 , 4 ) Fraction( 1 , 16 ) >>> Fraction( 1 , 16 ) * Fraction( 3 , 16 ) Fraction( 3 , 256 ) >>> Fraction( 3 , 16 ) / Fraction( 1 , 8 ) Fraction( 3 , 2 ) |
現(xiàn)在讓我們試試乘方操作:
1
2
|
>>> Fraction( 1 , 8 ) * * Fraction( 1 , 2 ) 0.3535533905932738 |
它返回一個浮點(diǎn)數(shù),可能是因?yàn)榉謹(jǐn)?shù)不能進(jìn)行合理的計算。實(shí)際上我們可以使用limit_denominator方法得到一個近似的Fraction值。
1
2
3
|
>>> f = Fraction( 1 , 8 ) * * Fraction( 1 , 2 ) >>> Fraction(f).limit_denominator() Fraction( 235416 , 665857 ) |
記住,你可以混合字符串和其他上邊實(shí)例化部分中提到的數(shù)據(jù)類型。
1
2
3
4
|
>>> Fraction( "1/2" ) + Fraction( 2.0 ) Fraction( 5 , 2 ) >>> Fraction( 2 ) * Fraction( " 1/2 " ) Fraction( 1 , 1 ) |
4 獲取Fraction對象的屬性
你已經(jīng)有了一個Fraction對象,并且已經(jīng)做了一些計算,現(xiàn)在我們?nèi)绾卧L問它的屬性呢?
不閱讀文檔的話,你或許會嘗試Fraction.numerator和Fraction.denominator,事實(shí)證明你是正確的。
1
2
3
4
5
|
>>> f = Fraction( 221 , 234 ) + Fraction( 1 , 2 ) >>> f.numerator 13 >>> f.denominator 9 |
或者作為一個字符串,打印整個分?jǐn)?shù):
1
2
3
4
5
|
>>> print f 13 / 9 >>> a = str (f) >>> a '13/9' |
這不是Fraction類的一部分,它是在fractions庫中的。利用它你可以快速找到兩個數(shù)的最大公約數(shù)。
首先導(dǎo)入:
1
|
from fractions import gcd |
一些例子:
1
2
3
4
|
>>> gcd( 100 , 75 ) 25 >>> gcd( 221 , 234 ) 13 |
6 總結(jié)
希望你已經(jīng)學(xué)到了一些關(guān)于在Python中處理分?jǐn)?shù)的東西。如果你想閱讀更多內(nèi)容,可以查看文檔。如果你感覺學(xué)起來非常有動力,可以看看源代碼。
如果你有更有趣的分?jǐn)?shù)使用方法,告訴我,我會將它們添加到指南中。