2020年10月11日星期日

003 與小卡特一起學 Python 第 3 章 基本數學運算

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


3 章 基本數學運算

剛開始在交互模式中使用 Python 時,我們已經看到它可以完成簡單的算數運算。現在來看 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)就是我們平常數數時所說的數,如 123,另外還包括 0 和負數,如 -1-2-3

小數(decimal number)也稱為實數(real number),這些數有小數點而且後面有小數位,如 1.250.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 00038 後面有 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-13E 記法會寫作 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 留言:

發佈留言