iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 3
2
Software Development

從零開始學Python系列 第 3

[Day 03] 從零開始學Python - 變數、型態、運算子:你的除法不是你的除法

註:本文同步刊載在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標籤的箱子。
請不要將其當成一般數學意義的等號來看待。

我們來做個練習吧!

  1. 假設圓周率為3.14,一個圓的半徑是7.77
    請用上面的所學及print()方法,
    在直譯器中印出該圓的周長和面積。
    (註:print()內可以放計算式子呦!)

  2. 承1,如果有另外兩個圓的半徑分別是5.3和2.5,
    請計算出這三個圓的周長的和和總面積。

那就明天見囉!


上一篇
[Day 02] 從零開始學Python - 語言起源及安裝使用:偉大的東西常常是無心插柳柳橙汁
下一篇
[Day 04] 從零開始學Python - 型態轉換及字串基礎:叫你印出來不是叫你開印表機阿!
系列文
從零開始學Python30

尚未有邦友留言

立即登入留言