註:本文同步刊載在Medium,若習慣Medium的話亦可去那邊看呦!
從前從前,有個聰明的小男孩叫高斯,
有天老師有事情要忙,出了一道算術題給全班慢慢寫:
1+2+3+...+100 = ?
誰知道高斯馬上就將這個題目用簡單的乘法給迅速算出來了,
答案是(1+100) * 100 / 2 = 5050。
這告訴我們,做人不要太白目XD
以下我們使用上一篇文章的直譯器,來試看看Python的計算。
在Python中的四則運算,基本上跟我們所認知的四則運算大部分相同,
那麼,要在Python中計算上面的式子的話,也許你會想這樣寫:
>>> (1+100) * 100 / 2
5050.0
咦?為什麼多一個小數點呢?
事實上,Python中在計算加減乘除的時候,只有除法比較特別,
當使用單斜線的除法時,計算結果會預設帶有小數點,
這種「型態」和原先的整數不同,
在Python中整數稱作int,而帶小數點的數字則稱為float。
所以說,你的除法不是你的除法XD
要取得相除的整數,請使用雙斜線:
>>> (1+100) * 100 // 2
5050
留意如果這當中你使用了帶小數點的數字,即便使用雙斜線,仍然會得到float的結果。
>>> (1+100) * 100 // 2.0
5050.0
(註:和Python不同,其他如Java/C++等語言,單斜線反而是取整數)
一般Python常見運算方式,除了加減乘除和整數除法外,
還有幾個常見的如% (取餘數運算子,如5 % 2會得到1)
** (取冪次,如a**b會得到a的b次方)
以及其他很多有的沒有的東西,以後我們有機會用到的時候再行介紹XD
剛剛提到了型態(type),在Python中每個資料都有其型態,
用來表明它是什麼種類的東西,我們可以使用**type()**的方法,
簡單列出一些常見的型態:
>>> type(10.0) # 浮點數
<class 'float'>
>>> type(10) # 整數
<class 'int'>
>>> type('25') # 字串,可以用兩個單引號或兩個雙引號括住
<class 'str'>
>>> type(True) # 布林值,只分成True(真)或False(偽)
<class 'bool'>
>>> type(False)
<class 'bool'>
>>> type(None) # None,代表什麼都沒有,通常發生在東西不存在時
<class 'NoneType'>
回到我們的1加到100,
上面的公式我們知道,在國小的時候通常被稱為梯形公式:
(上底 + 下底) * 高 / 2
在1加到100中,由於下底和高相同,所以才會都是100,
那麼今天如果連續要算不同的梯形面積呢?每次重複寫好像有一點點麻煩,
這時候我們可以先將這三個不同的東西寫成「變數」。
所謂的變數就是會變的數(廢話)
讀者可以想像成一個箱子,這個箱子將用來存放資料,
並且為了知道我們在找哪個箱子,我們會為它貼上標籤並取名。
舉例來說:
>>> top = 1
>>> bottom = 100
>>> h = 100
>>> (top + bottom) * h // 2
5050
「變數名稱 = 值」的意義是將等號右邊的值(也可以是運算式),
存放到貼有等號左邊標籤的箱子中。它並不是我們數學中的兩者相等
讀者可以嘗試,如果這時候將bottom改變的話,計算結果應該也會改變:
>>> bottom = 200
>>> (top + bottom) * h // 2
10050
>>> type(bottom) # type()的方法也可以拿來看變數
<class 'int'>
>>> bottom = "XD" # 改動bottom的值並不會受限於原先的型態 (對了,井字號是註解,包含它及其身後的整行都不會被執行到喲!)
>>> print(bottom)
XD
請讀者留意,前面執行bottom=100時,我們生成了一個名為bottom的變數,
後面執行到bottom=200時,則是生成另一個變數,再將bottom這個標籤貼到上面去。
在Python中更動內容這件事情相對來說十分自由,
即便現在bottom是整數,
你仍然可以透過前面的賦值來改變成別的東西。(因為這是新的東西)
(如上面最後就改成字串了)
同時,當我們將兩個變數用等號相連時,
只相當於將標籤名稱貼到同一個箱子上。
>>> a = 10
>>> b = a
>>> b # 直譯器中直接打變數名字,可以將其輸出到螢幕上
10
>>> id(a) # id()方法,可以將一個變數所存放在的記憶體(就是存箱子的空間)位置印出來
140733754578720
>>> id(b) # 看吧!兩個一模一樣
140733754578720
>>> a = 123 # a的標籤從.....720的位置拔掉,貼到存放有123的新箱子
>>> id(a)
140733754582496
>>> id(b) # b的標籤還在原地
140733754578720
>>> b # b不改變
10
講到這邊好像有點多吼?會不會難消化呢?
再加一點點就為今天做個收尾吧!
我們剛剛學到了變數、型態、及運算子,
假設你是班代,要幫系上同學訂書收錢,跟小明收300,跟小華收500......
這時候,你希望有一個變數能夠儲存收款的狀況。
對於第一筆款項也許你會這樣寫:
>>> total = 0
>>> total = total + 300
>>> total
300
但太麻煩了,你要寫兩次total,有沒有簡單一點的寫法呢?
有的,那就是「+=」。a += b的效果,等同於a = a + b。
>>> total += 500
>>> total
800
假定你收完了錢,廠商跟你說我們這次沒有特價了,
所以書錢變為兩倍:
>>> total *= 2 # 總共應收款項,只好再去討錢囉!a *= b 和 a = a * b相同
>>> total
1600
上面這類型的運算子稱之為指定運算子,
可以達到省略多寫一次第一個變數的目的,看起來比較簡潔。
+=, -=, *=, /=, //= ...... 讀者可以自行運用。
特別強調,a = a + b的意義,
是將a + b算完後,置入到貼有a標籤的箱子。
請不要將其當成一般數學意義的等號來看待。
我們來做個練習吧!
假設圓周率為3.14,一個圓的半徑是7.77
請用上面的所學及print()方法,
在直譯器中印出該圓的周長和面積。
(註:print()內可以放計算式子呦!)
承1,如果有另外兩個圓的半徑分別是5.3和2.5,
請計算出這三個圓的周長的和和總面積。
那就明天見囉!