2017年11月12日 星期日

用 Python 來做分數運算

若是頭一擺來遮,建議先來踏話頭

請共教育部閩南語常用辭典開--咧,隨時會當查。

我佇教囡仔小學 ê 數學時,有時想欲驗算一遍。毋過,咱這馬雖然有計算機,毋過,伊無法度算分數, 拄好我佇耍 Python, 來揣看覓 Python 有法度做--無?

這 "分數" 毋是老師佇共學生拍分數,是二分一 (1/2),三分二(2/3) 這種分數。


參考文章: Dealing with fractions in Python


基礎

首先,咱愛 uì fractions 這咧 Module 共 Fraction 這个函式搝--入來:



from fractions import Fraction
Fraction 佇英文都是 "分數" ê 意思,  頭一咧參數是分子,第二个是分母,譬如講, 3/12 是寫做:
>>> Fraction(3, 12)
Fraction(1, 4)
Fraction(1, 4)。 1/4 是 3/12 化簡過來ê。

若欲看落去較直覺,也都是和數學寫的 3/12 較相仝,你嘛會使用:
>>> Fraction('3/12')
Fraction(1, 4)
你嘛會使共小數(佇電腦伊是用浮點數表示)成做分數:
>>> Fraction(2.5)
Fraction(5, 2)
雖然伊會自動共浮點數(float)轉換, 毋過驚有精差(電腦計算小數有伊的限制), 也是用單引號共伊挾起來較安全:
>>> Fraction('2.5')
Fraction(5, 2)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> Fraction('1.1')
Fraction(11, 10)

約分

咱若有看較斟酌--ê ,頂仔的例,伊會自動共分數約分,也就是共伊化做上簡單 ê 分數:
>>> Fraction(153, 272)
Fraction(9, 16)

通分

你若是共兩的分數加--起來抑是減--落去, 伊會自動通分:
>>> Fraction(1, 2) + Fraction(3, 4)
Fraction(5, 4)
按呢有讚--無? 閣較讚个是, 若是一个分數和整數相加--起來, 伊嘛會自動轉做分數: 
>>> Fraction(5, 16) + 3
Fraction(53, 16)

## 加 .0 佇後壁, 伊都共 3.0 當做浮點數囉!
>>> Fraction(5, 16) + 3.0
3.3125

賰的二元運算 (Binary Operations)

除了加,減,乘佮除嘛是會用得:
>>> 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)

共分子抑是分母提出來

你若是干焦欲挃分子,會使用 .numerator 這个方法。若是分母, 用 .denomintor
>>> f = Fraction(221, 234) + Fraction(1, 2)
>>> f.numerator
13
>>> f.denominator
9

共假分數 (imprpoer fraction) 成做帶分數 (mixed numeral)

Fraction() 所算出來个結果,攏是分數,無論是真分數(proper fraction) 抑是假分數 (improper fraction),有時咱愛家己轉換:
>>> int(73/14)
5                   # 這是整數部分
>>> str(Fraction(73%14, 14))
'3/14'              # 這是分數部分


寫一咧小學生看有ê程式


當然,小學生按呢共in講可能嘛是傷複雜,你會用寫簡單 ê 函式來轉換:
from fractions import Fraction
def Frac(x):                    # 單純化簡
    return str(Fraction(x))

def FracOp(x, op, y):           # +, -, *, / 四種運算
    if op == '+':
        result = Fraction(x) + Fraction(y)
    elif op == '-':
        result = Fraction(x) - Fraction(y)
    elif op == '*':
        result = Fraction(x) * Fraction(y)
    elif op == '/':
        result = Fraction(x) / Fraction(y)


    return str(result)


def FracMix(x):                    # 共假分數成做帶分數
    num, dem = x.split('/')
    i = int(int(num)/int(dem))
    dem = Fraction(int(num)%int(dem), int(dem))
    return str(i)+'+'+str(dem)

咱來奕看覓:
>>> from myfrac import Frac,FracOp,FracMix
>>> FracMix('10/3')
'3+1/3'                        # 這是帶分數
>>> Frac('12/24')
'1/2'                           # 這是約分
>>> FracOp('12/24', '+', '3/9')   #這是加法,自動通分
'5/6'
>>> FracOp('12/24', '/', '3/9')   #這是除法
'3/2'
按呢看來, 都共數學式較sîng,都賰 Frac, FracOp, FracMix 三的函式來使用都好阿!

咱若是會共 jupyter 敆做伙使用,無定著是一種袂䆀 ê 教材呢,因為佇線頂,袂曉 python ê 人,干焦拍開網頁, 共事先準備好个稿掠入來,就會當用這三的函式阿,下一回來介紹 jupyter!

沒有留言:

佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...