Featured image of post 從零開始學Python (3) — 變數、型態、運算子:你的除法不是你的除法

從零開始學Python (3) — 變數、型態、運算子:你的除法不是你的除法

Day 03 變數、型態、運算子:你的除法不是你的除法

註:本篇文章同步刊載於iT邦幫忙,為鐵人賽之系列文章。
https://ithelp.ithome.com.tw/articles/10237877

從前從前,有個聰明的小男孩叫高斯,
有天老師有事情要忙,出了一道算術題給全班慢慢寫:
1+2+3+…+100 = ?
誰知道高斯馬上就將這個題目用簡單的乘法給迅速算出來了,
答案是(1+100) * 100 / 2 = 5050。

*這告訴我們,做人不要太白目XD *

以下我們使用上一篇文章的直譯器,來試看看Python的計算。
在Python中的四則運算,基本上跟我們所認知的四則運算大部分相同,
那麼,要在Python中計算上面的式子的話,也許你會想這樣寫:

1
2
>>> (1+100) * 100 / 2
5050.0

咦?為什麼多一個小數點呢?
事實上,Python中在計算加減乘除的時候,只有除法比較特別,
當使用單斜線的除法時,計算結果會預設帶有小數點,
這種「型態」和原先的整數不同,
在Python中整數稱作int,而帶小數點的數字則稱為float。
所以說,你的除法不是你的除法XD
要取得相除的整數,請使用雙斜線:

1
2
>>> (1+100) * 100 // 2
5050

留意如果這當中你使用了帶小數點的數字,即便使用雙斜線,仍然會得到float的結果。

1
2
>>> (1+100) * 100 // 2.0
5050.0

(註:和Python不同,其他如Java/C++等語言,單斜線反而是取整數)

一般Python常見運算方式,除了加減乘除和整數除法外,
還有幾個常見的如**% (取餘數運算子,如5 % 2會得到1)**
\ (取冪次,如a\b會得到a的b次方)
以及其他很多有的沒有的東西,以後我們有機會用到的時候再行介紹XD

剛剛提到了型態(type) ,在Python中每個資料都有其型態,
用來表明它是什麼種類的東西,我們可以使用type() 的方法,
簡單列出一些常見的型態:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>>> 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,
那麼今天如果連續要算不同的梯形面積呢?每次重複寫好像有一點點麻煩,
這時候我們可以先將這三個不同的東西寫成「變數」。
所謂的變數就是會變的數(廢話)
讀者可以想像成一個箱子,這個箱子將用來存放資料,
並且為了知道我們在找哪個箱子,我們會為它貼上標籤並取名。

舉例來說:

1
2
3
4
5
>>> top = 1
>>> bottom = 100
>>> h = 100
>>> (top + bottom) * h // 2
5050

「變數名稱 = 值」的意義是將等號右邊的值(也可以是運算式),
存放到貼有等號左邊標籤的箱子中。它並不是我們數學中的兩者相等

讀者可以嘗試,如果這時候將bottom改變的話,計算結果應該也會改變:

1
2
3
4
5
6
7
8
>>> 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是整數,
你仍然可以透過前面的賦值來改變成別的東西。(因為這是新的東西)
(如上面最後就改成字串了)

同時,當我們將兩個變數用等號相連時,
只相當於將標籤名稱貼到同一個箱子上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
>>> 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……
這時候,你希望有一個變數能夠儲存收款的狀況。
對於第一筆款項也許你會這樣寫:

1
2
3
4
>>> total = 0
>>> total = total + 300
>>> total
300

但太麻煩了,你要寫兩次total,有沒有簡單一點的寫法呢?
有的,那就是「+=」。a += b的效果,等同於a = a + b。

1
2
3
>>> total += 500
>>> total
800

假定你收完了錢,廠商跟你說我們這次沒有特價了,
所以書錢變為兩倍(WTF?):

1
2
3
>>> 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,
    請計算出這三個圓的周長的和和總面積。

那就明天見囉!

工商時間:

抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)
Python Taiwan的連結第100篇的文章 底下,
公開分享到你的臉書、按讚該篇文章、並留言告訴我說,
「你最喜歡這一整個系列的哪一篇?為什麼?」或
「除了從LeetCode學演算法系列以外,
你還想要看到關於什麼方向的文章?」

超過20則留言的話 (有完成以上步驟的才算),我們就抽一組
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」
課程的免費兌換券進行贈送!

期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)

容筆者工商一下,
「從Leetcode學演算法|進階篇」 開放預購啦!
這次選了40道難度加深的LeetCode題目,
同樣也會細部解說對應的技巧及須要掌握的演算法!
同時這次購買進階篇的話,
額外還加贈**「從Leetcode學演算法|面試篇」** !
當中包含了面試準備須知分享及訪談國內外不同經驗的工程師
讓你不論是想走前端/後端/一般軟工 或者是想找國外的工作
初學想轉職 還是正在工作 ,都能夠從中得到收穫呦!
有興趣的朋友可以使用下面的早鳥優惠~
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」
https://bit.ly/advleetcode

「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠:
https://bit.ly/allleetcode

共發表了 171 篇文章 ‧ 總計 311.6k
使用 Hugo 建立
主題 StackJimmy 設計