申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!

第 3 章 基本數學運算
剛開始在交互模式中使用 Python 時,我們已經看到它可以完成簡單的算數運算。現在來看 Python 還能對數字做些什麼,還能完成哪些數學運算。也許你沒有意識到,不過要知道,數學確實無處不在!特別是在程式設計中,我們一直都在使用數學。這並不是說你必須成為一位數學大師才能學習程式設計,不過可以想想看……每個遊戲都有某種需要累計的分數;在螢幕上繪製圖形時必須使用數位來確定圖形的位置和顏色;移動的物體會有方向和速度,這都要用數字來描述。所有有意思的程式幾乎都會以某種方式使用數位和數學。所以下面就來學習 Python 中有關數學和數字的一些基礎知識。
3.1 四大基本運算
在第 1 章中我們已經看到 Python 可以做一些數學運算:使用加號(+)完成加法,另外使用星號(*)完成乘法。
如你所料,Python 使用連字型大小(-)(也稱為減號)來做減法:
>>>
print 8 - 5
3
由於電腦鍵盤上沒有除號(÷),所以所有程式都使用前斜杠(/)表示除法。
>>>
print 6/2
3
這是對的。不過有時 Python 做除法時會得到意外的結果:
>>>
print 3/2
1
咦?我還以為電腦精通數學計算呢,原來不過如此!所有人都知道
3 / 2
= 1.5
這到底怎麼回事?
嗯,雖然看起來好像很傻,其實 Python 確實想表現得聰明一些。要解釋這個問題,你要知道整數和小數。如果你還不知道它們的區別,先來看看術語箱中簡單的解釋。
術語箱
整數(integer)就是我們平常數數時所說的數,如 1、2、3,另外還包括 0 和負數,如 -1、-2、-3。
小數(decimal number)也稱為實數(real number),這些數有小數點而且後面有小數位,如 1.25、0.3752 和 -101.2。
在電腦程式設計中,小數也稱為浮點數(floating-point number,有時簡寫為 floats,或者如果只有一個浮點數,就簡寫為 float)。這是因為小數點會“浮動”。0.00123456 或 12345.6 都是浮點數。
因為你輸入的 3 和 2 都是整數,所以 Python 認為你同樣想要整數作為答案。所以它會把答案 1.5 取整為比它小且最接近的整數,也就是 1。換句話說,Python 完成了不帶餘數的除法。
要解決這個問題,可以這樣試試看:
>>>
print 3.0 / 2
1.5
這樣就好多了!如果把兩個數中的任何一個作為小數輸入,Python 就會知道你想在答案中保留小數部分。
整除
在 Python 2 中,做除法的方式稱為“整除”(floor division)。但 Python 3 的工作方式不一樣,在 Python 3 中,如果你使用常規的除法操作符(前斜杠“/”),則做的是常規除法,而不是整除。
>>>
print 3/2
1.5
要在 Python 3 中做整除,需要使用兩個前斜杠(//):
>>>
print 3//2
1
這是 Python 2 和 Python 3 最顯著的區別之一,也是導致很多 Python 2 程式與 Python 3 程式不相容的原因。
切記!
要記住 Python 2 的這種整除行為。這很重要,很多 Python 程式師(包括我自己)都曾經因為忘記這一點犯過錯。
3.2 操作符
+、-、* 和 / 符號都稱為操作符。這是因為它們會“操作”或處理放在符號兩邊的數位。= 號也是一個操作符,這稱為賦值操作符(assignment operator),因為我們用它為一個變數賦值。
注意!這個詞有意思!
操作符(operator)就是會對它兩邊的東西有影響或者有“操作”的符號。這種影響可能是賦值、檢查或者改變一個或多個這樣的東西。

完成算數運算的 +、-、* 和 / 符號都是操作符。
所操作的東西稱為運算元(operand)。
3.3 運算順序
下面哪一個正確?
2 + 3
* 4 = 20
還是
2 + 3
* 4 = 14
這要看你採用什麼順序來計算。如果先做加法,會得到
2 + 3
= 5,
然後得到
5 * 4
= 20
如果先做乘法,就會得到
3 * 4
= 12,
然後是
2 +
12 = 14
第二個順序是正確的,所以正確答案是 14。在數學中有一種運算順序(order of operation),指定了先計算哪些操作符,後計算哪些操作符,而不管它們的書寫順序如何。
在我們的這個例子中,儘管 + 號在 * 號前面,但是應當先算乘法。Python 會遵循正確的數學規則,所以它會先做乘法再做加法。可以在交互模式中試試看,看看能不能得到這個結果:
>>>
print 2 + 3 * 4
14
Python 使用的順序與你在數學課上學到的(或者將要學到的)規則完全相同。指數運算最優先,然後是乘除,再後面是加減運算。
如果希望改變運算順序,先完成某個運算,只需要在它兩邊加上括弧(圓括號),比如:
>>>
print (2 + 3) * 4
20
這一次,Python 會先做 2 + 3(因為有括弧),可以得到 5,然後再做乘法 5 * 4,得到 20。
再強調一次,這與數學課上講的是一樣的。Python(和所有其他程式設計語言)都會遵循正確的數學規則和運算順序。
3.4 另外兩個操作符
還有兩個算術操作符要告訴你。程式中需要的 99% 的操作符就是這兩個操作符再加上前面剛講的 4 個基本操作符。
指數——自乘為一個冪
如果把 3 乘 5 次,可以寫成
>>>
print 3 * 3 * 3 * 3 * 3
243
不過,這就等同於 35,或者“3 的指數為 5”,也就是“3 的 5 次冪”。Python 用一個雙星號表示指數或者將一個數自乘為一個冪。
>>>
print 3 ** 5
243
切記!
很多語言和程式可能使用其他符號來表示自乘為一個冪。一種常用的符號是 ^(例如 3^5)。如果在 Python 中使用這個符號,你不會得到一個錯誤消息,只不過答案不正確。(這是因為,^ 在 Python 中另有含義————我們可不希望這樣!)這個問題可能很難調試。一定要使用 ** 操作符表示自乘為一個冪 [ 也稱為求冪(exponentiation)]。
之所以使用指數而不是直接做多次乘法,這是因為鍵入時會更容易一些。不過更重要的原因是,利用 ** 還可以用非整數作為指數,如下:
>>>
print 3 ** 5.5
420.888346239
要想利用乘法來做到這一點可不容易。
取餘——求餘數
在 Python 中第一次嘗試除法時,我們已經看到,如果將兩個整數相除,Python 2 會給你一個整數答案。(Python 3 使用 // 操作符。)也就是說,它在完成整數除法。不過,在整數除法中,答案實際上有兩部分。
還記得剛開始學除法嗎?如果兩個數不能整除,最後會得到一個餘數(remainder):
7 / 2
= 3,餘數是 1
7 / 2 的答案中有一個商(quotient),在這裡就是 3,還有一個餘數(remainder),這裡的餘數是 1。如果在 Python 中將兩個整數相除,它會給你商。不過餘數呢?
Python 有一個特殊的操作符來計算整數相除的餘數。這稱為取餘(modulus)操作符,這個符號是百分號(%)。可以像這樣使用:
>>>
print 7 % 2
1
所以如果同時使用 / 和 %,就可以得到整數相除的完整答案:
>>>
print 7 / 2
3
>>>
print 7 % 2
1
可以看到,7 除以 2 得 3,餘數是 1。如果做浮點數除法,會得到小數答案:
>>>
print 7.0 / 2
3.5
實際上,既然你提到了這一點,應該說操作符和操作員確實很接近……就像老式電話接線員連接電話一樣,算術操作符按同樣的方式把數位連接在一起。
我想告訴你的還有另外兩個操作符。我知道,我剛才已經說過只再講兩個,不過別擔心,這兩個操作符非常容易!
自增和自減
還記得上一章中的例子:score = score + 1 嗎?我們說過,這稱為自增(incrementing)。與它類似的是 score = score - 1,這稱為自減(decrementing)。這些運算在程式設計中經常出現,因此有自己專門的操作符:+=(自增)和 -=(自減)。
可以像這樣使用:
或者:
其中第一個例子將 number 增 1(這會從 7 變成 8)。第二個例子將 number 減去 1(從 7 變成 6)。
3.5 非常大和非常小
還記得第 1 章中將兩個非常大的數相乘嗎?我們得到的答案也是一個非常大的數。
有時 Python 會用一種稍微不同的方式顯示非常大的數。可以在交互模式中試試看:
>>>
print 9938712345656.34 * 4823459023067.456
4.79389717413e+025
>>>
(具體鍵入什麼數並不重要——任何包含小數的大數值都可以。)
這個 e 是電腦中顯示非常大或非常小的數時採用的一種方法。這叫做 E 記法(E-notation)。處理非常大(或非常小)的數時,要把所有數位以及小數位都顯示出來可能很費勁。這種數在數學和科學領域經常出現。例如,如果一個天文程式要顯示從地球到 Alpha Centaur 星的公里數,可能會顯示為 38000000000000000 或者 38 000 000 000 000 000(38 後面有 15 個 0)。不論哪種方式,數完所有這些 0 都會讓你累得夠嗆。
顯示這些數還有另一種方式,就是使用科學計數法(scientific notation),就是一個小數再乘以一個 10 的冪。在科學計數法中,地球到 Alpha Centauri 的距離可以寫作:3.8 × 1016(看到了嗎,16 抬高了,而且要小一點)。這讀作“3.8 乘以 10 的 16 次冪”或者“3.8 乘以 10 的 16 次方”。它的意思就是,把 3.8 的小數點向右移 16 位,並在這個過程中根據需要補 0。

如果可以像這裡一樣,把 16 寫作指數,稍稍抬高一點,再寫得小一點,科學計數法就很適用。如果你用紙和筆,或者使用一個支援上標的程式,就可以用科學計數法。
術語箱
上標(superscript)是指一個字元或一組字元比其餘文本高一些,例如 1013。這裡的 13 就是上標。通常上標還要比正文小一點。
下標(subscript)也類似,不過這些字元會比其餘文本低,同樣也會小一點, 比如 log2。這裡的 2 就是一個下標。
不過並不是哪裡都能使用上標,所以還有另一種方法,就是 E 記法。E 記法只是科學計數法的另一種寫法。
E 記法
在 E 記法中,這個數要寫作 3.8E16 或者 3.8e16。讀作“3.8 指數 16”或者簡讀作“3.8 e 16”。這裡假設指數是 10 的冪。這就等同于寫成 3.8×1016。
在大多數程式和電腦語言(包括 Python)中,大寫和小寫 E 都是 允許的。
對於非常小的數,如 0.0000000000001752,可以使用一個負指數。科學計數法會寫作 1.752×10-13,E 記法會寫作 1.752e-13。負指數表示要把小數點向左移而不是向右移。

採用 E 記法,可以在 Python 中輸入非常大和非常小的數(或者可以是任何數)。後面我們還會學習如何讓 Python 使用 E 記法打印數。
試試採用 E 記法輸入一些數:
>>>
a = 2.5e6
>>>
b = 1.2e7
>>>
print a + b
14500000.0
儘管我們用 E 記法輸入了數,但得出的答案卻是一個常規的小數。這是因為,除非你特別要求,或者數字確實非常大或非常小(有很多個 0),否則 Python 不會用 E 記法顯示數位。
可以試試看:
>>>
c = 2.6e75
>>>
d = 1.2e74
>>>
print c + d
2.72e+75
這一次 Python 會自動用 E 記法顯示答案,因為顯示一個有 73 個 0 的數太不可思議了!
如果希望用 E 記法顯示類似 14 500 000 的數,需要給 Python 下達一些特殊的指令。我們將在本書的第 21 章學習更多相關內容。
別擔心,放鬆點
如果你還不太理解 E 記法到底是怎麼回事,不用擔心。這本書後面的程式中不會用到它。我只是想讓你瞭解一下它的原理,沒准以後你會用到。
如果使用 Python 來完成一些數學運算,得到的答案是一個類似 5.673745e16 的數,至少現在你知道這是一個非常大的數,而不是出現了什麼錯誤。
指數與 E 記法
不要把自乘得到冪(也稱為求冪)和 E 記法弄混了。
·
3**5 表示 35,或“3 的 5 次冪”,也就是 3 * 3 * 3 * 3 *
3,等於 243。
·
3e5 表示 3 * 105 或者“3 乘以 10 的 5 次冪”,也就是 3 * 10 * 10 * 10 * 10 *10,結果等於 300 000。
·
求冪是指一個數自乘得到冪。E 記法表示乘以 10 的幾次冪。
有些人可能會把 3e5 和 3**5 都讀作“3 指數 5”,不過,它們是完全不同的。怎麼讀並不重要,只要你懂得它們分別代表什麼含義。
你學到了什麼
在這一章,你學到了以下內容。
·
用 Python 如何完成基本數學運算。
·
整數和浮點數。
·
求冪(自乘得到一個冪)。
·
如何計算取餘(餘數)。
·
E 記法的有關內容。
測試題
1. Python 中乘法使用哪個符號?
2. Python 計算 8 / 3 的答案是什麼?
3. 怎麼得到 8 / 3 的餘數?
4. 怎麼得到 8 / 3 的小數結果?
5. Python 中計算 6 * 6 * 6 * 6 的另一種做法是什麼?
6. 採用 E 記法,17 000 000 要寫作什麼?
7. 4.56e-5 如果按常規的寫法是什麼(不是 E 記法)?
動手試一試
1. 使用交互模式或者編寫一個小程式解決下面的問題。
(a) 3 個人在餐廳吃飯,想分攤飯費。總共花費 35.27 美元,他們還想留 15% 的小費。每個人該怎麼付錢?
(b) 計算一個 12.5m×16.7m 的矩形房間的面積和周長。
2. 寫一個程式,把溫度從華氏度轉換為攝氏度。轉換公式是 C = 5 / 9* (F-32)。(提示:當心整除問題!)
3. 你知道怎麼計算坐車去某個地方需要花多長時間嗎?相應的公式(用文字表述)是“旅行時間等於距離除以速度”。編寫一個程式,計算以 80 km/h 的速度行駛 200 km 需要花多長時間,並顯示答案。











0 留言:
發佈留言