logo

Thursday 24th of May 2012

廣告

廣告贊助商

數值運算 PDF 列印 E-mail
作者是 Victor   
週三, 11 二月 2009 21:09

Python的數值運算

Python 在需要數學計算的領域受到相當程度的歡迎,我們可以猜想,Python的數值運算能力相當強大?是的,Python的數值運算的確非常強大,本身就有良好的體質,在加上第三方函式庫的加持,Python在這方面可以說是數學運算的最佳選擇,現在就讓我們來介紹Python有的運算能力。

數字的表示

Python有幾種值,首先是整數,也就是沒有帶小數點的數字,例如 :0、10、123、-999、1234567這些都算是整數,而Python在數值上一個很大的優勢就是,整數基本上是沒有限制位數的,也就是,不管你是999999999999999999999還是1234567890123456789,只要超過一定範圍,Python都會幫你轉換成"長整數",也就是對Python而言沒有限制位數的整數,如此一來你就可以進行任何你想要的天文數字運算而不用受到語言限制。

有小數點的是浮點數,例如 : 0.1、123.456、3.1415、123.0都是浮點數,你可能覺得很奇怪,123.0明明就是整數,它的小數點是0,為何說它是浮點數,其實只要數字有.後面加任何數字,就算是0也會被視為浮點數,還有請記住一點就是, 浮點數有誤差,並不是完全精確的,目前只要先知道這點就好,而符點數也可以用科學表示法來表示,例如 : 1.23e-007、1e+017。

接著Python最神奇的一點就是,它有複數的數值類形,例如1 + 2j、123.5 + 456.7j、0.5J這些都是複數,就我個人而言我是用不到複數,但是數學領域,或是電子學的計算,例如傅利葉轉換就會用到複數。

數值運算

接著讓我們來介紹Python的基本數值運算,當然最基本的就是+、-、*、/、%,分別是加、減、乘、除、求餘數,基本上跟其它程式語言差不多,我們在下面介紹 :

+
-

加減運算,例如 : 123+456、abc+1、100+money等等,相當簡單易懂。

*

乘法運算,例如 : 7*5、times*10、money*0.5等等。

/

除法運算,例如 : member / 10、10/5、10/0.3等等,但是請注意,除以0會引發錯誤,現在請先記得不要除以0就好。

%

求餘數運算(模除),例如 : 我想求 100是不是2的倍數,我可以用100 % 2,看餘數是不是0,是0的話就表示可以整除,也就是2的倍數
,這裡也請注意,求餘數因為其實就是除完之後才得知餘數是多少,所以骨子裡也是除法,既然是除法,和除法一樣,不能模除0。

運算結果小數點的問題

如果上面你學會如何運算,也自己試試看之後,你可能會發現一個問題,就是運算結果怎麼跟我想的不一樣,例如10/3應該會是3.33333....,可是答案卻顯示3,原因很簡單, 這部份Python跟其它很多語言都一樣,會看兩個運算子的類形 :

如果整數和整數做運算,結果就會是整數,因為整數不能存放小數點以後的數字,所以小數的部份就會被捨去。

如果浮點數和浮點數做運算,結果就會是浮點數,小數的部份會被保留下來,但是跟上面說的一樣,因為是浮點數,所以會有誤差。

如果是兩種不同的數值做運算,Python會以把兩個運算子間較簡單的形別轉換成比較複雜的形別下去做運算,例如50*0.5,因為0.5是浮點數,有小數比起整數來的複雜,所以50會被轉換成50.0,而兩個浮點數運算結果就會是浮點數,又例如10 + 3j - 3j,雖然複數的部份被減掉了,結果變成10 + 0j,但是因為和複數運算,複數比較複雜,因此整數的部份也會被變成複數,所以運算結果會是複數,總而言之,只要記得這個法則,可以知道運算的結果是什麼形別了,就是比較複雜的那個形別。

形別轉換問題

# 數字A設為整數100
NumberA = 100

# 數字B設為整數
NumberB = 30

# 這裡印出來的結果是3
print NumberA / NumberB

上面這段程式碼示範兩個整數相除,這時你可能想到一個問題,那如果我想要保留運算結果的小數點怎麼辦? 方法很簡單,就是先把其中一個數轉換成浮點數,依照上面的規則,另一個整數其實也會被轉換成浮點數,如此一來答案就會是浮點數,而且保留小數的部份,如果是一個變數和一個常數做運算很簡單,例如 NumberA / 30.0,但是上面兩個都是變數阿! 那該如何是好? Python這時就有提供轉換數值形別的函數 :

int(數值) 將數值轉換成整數,也就是會捨棄小數點等等

float(數值) 將數值轉換成浮點數

complex(數值) 將數值轉換成複數

有了這些函數可以使用,我們就能轉換一個運算子的形別,或是捨去小數點等等,除此之外也可以用來將字串等也轉成整數或浮點數

下面這個範例改寫上面的程式,我們想要結果是保留小數 :

# 數字A設為整數100
NumberA = 100

# 數字B設為整數
NumberB = 30

# 這裡印出來的結果是3.33333333333
print float(NumberA) / NumberB

# 這裡印出來的結果也是3.33333333333
print NumberA / float(NumberB)

# 這裡印出來的結果還是3.33333333333
print float(NumberA) / float(NumberB)

事實上你的float轉換加在其中一個就可以了,因為照上面寫的規則,只要有一個浮點,另一個會被自動轉成浮點來計算,當然,你也可以例用int函數,將小數點的部份捨去轉變成整數 :

# 圓周率
PI = 3.14159

# 我們只想知道它整數的部份,所以把它轉成整數再輸出
# 因此輸出的結果是 3
print int(PI)

Python與其它語言不同的數值運算

上面的概念大至上和其它的語言都大同小異,現在我們要介紹Python和其它語言不太一樣的運算 : **和//

**

乘方運算,也就是某個數的幾次方的意思,例如你想算2的5次方,一般打字是打2^5,而在Python裡要寫2 ** 5,而它的好處還有,小數點一樣也可以運算,所以假設我們要計算 16 開平方等於多少,就可以這樣寫 16 ** 0.5,相當方便的一個運算語法。

//

捨去小數的除法運算,也就是就算照上面的規則,兩個浮點數相除,它還是會幫你捨去小數,例如10.0 // 3.0結果會是3.0,它幫你捨去小數了,當然,別忘了,這也算是除法,都一樣除0就會出錯的。

運算的優先順序

相信大家在小學時都有學過先乘除後加減的概念,是的,在程式語言,例如Python也是如此,有這樣的概念,像 1 + 2 * 3答案會是7,它會依照運算的優先順序幫你決定哪些先算,但是我並不打算列出那樣的順序表,因為我認為記那樣的東西沒有什麼價值,因為程式除了給機器看還要給人看,當然是越清楚越好,所以遇到這種情況,不管三七二十一,一律都用()把我想讓它先算的部份括起來,這樣子好處就是你不用記什麼優先順序,括號就對了,二來這樣看的人也一目了然知道哪些先算。

從數學公式到Python運算語法

事實上,任何公式都可以用程式語言寫出來,這裡我們示範將一個簡單的公式用Python寫出來,這個公式就是加總的公式 :

1 + 2 + 3 + .... + 100

其實可以寫成 ((1 + 100) * n) / 2

一般式也就是 ((首項 + 末項) * 項數) / 2

這樣的式子沒有任何難度,只是全部擠在一行上面而以,這裡因為用打字的沒畫圖,所以看不出差別來,不然其實只要搞清礎運算順序,然後分子分母的關係變成除法,就結束了,以下是這個程式。

# 首項
n = 1

# 末項
m = 100

# 用Python寫的加總公式
result = ((m + n) * (m - n + 1)) / 2

# 將運算結果印出來,答案是5050
print result

是的,就是那麼簡單,這樣的範例沒什麼難度,我們找來稍微複雜一點的數學公式 : 一元二次方程式解公式

公式請連至Wiki查看,我們在這裡說明如何從數學公式改寫成Python,只是為了示範,所以我們只示範其中一個解的公式 :

首先,我們看到分子和分母,就很直覺的這一定是除法。

分子 / 分母

像這樣,只是改寫成公式的運算,還有記得想要優先運算全部加上()

(分子) / (2 * a)

接下來我們開始轉換分子

-b就直接寫,比較複雜的是裡面,b平方減4ac,用到我們上面教的乘方運算 ** 來做平方和開根號

((b ** 2) - (4 * a * c)) ** 0.5

所以組合起來就是

-b + (((b ** 2) - (4 * a * c)) ** 0.5)

分子就完成了,因此整個式子合起來就是

(-b + (((b ** 2) - (4 * a * c)) ** 0.5)) / (2 * a)

這樣的公式有點長,當公式過長時,我們可以考慮將公式拆成幾個變數湊起來

# x^2 -3x + 2公式裡的變數a, b, c
a = 1
b = -3
c = 2

# 分子部份
n = -b + (((b ** 2) - (4 * a * c)) ** 0.5)

# 分母部份
m = 2 * a

# 計算結果
result = n / m

# 印出結果,其中一個解答案等於2
print result
 

核心是 Joomla!. Designed by: Free Joomla Theme, whois protect. Valid XHTML and CSS.