Learning Objectives
- 說明變數的用法:變數是名稱,用 = 指向記憶體裡的物件
- 認識識別字規則與 Python 的關鍵字(保留字)
- 介紹算術運算子(Arithmetic Operators):+ - * / // % **
- 介紹指定運算子(Assignment Operators)與海象運算子 :=
為什麼需要變數
程式要處理資料:成績、價格、名字、感測器讀數。我們需要替這些資料取名字,之後才能再拿出來用、拿來計算。 這個名字就是變數。
在 Python 裡,變數不是一個「裝東西的盒子」,而比較像一張名牌:
total = 10
這行的意思是:在記憶體裡建立整數物件 10,再讓名稱 total 指向它。
- Python 不需要事先宣告變數或它的型態,第一次指定值(
=)時就自動建立 =是「指定」,不是數學上的「等於」:先算出右邊的值,再讓左邊的名稱指向它- 同一個名稱之後可以改指向別的物件,甚至是不同型態的物件
指定與重新指定
看右邊的變數面板:每執行一行 =,就多一個名稱或某個名稱換了值。特別注意第 7 行 total = total + 5:右邊用的是 total「原本」的值。
多重指定與交換變數
x = y = z = 1 讓三個名稱指向同一個值;a, b, c = 1, 2, "John" 依位置一一對應。第 9 行的 a, b = b, a 是 Python 交換兩個變數最常見的寫法,和第 13~15 行的三步驟寫法比較看看。
識別字(identifier)與關鍵字
變數、函數、類別、模組的名稱統稱為識別字,規則如下:
- 第一個字必須是文字或底線
_,第二個字以後可以是文字、數字或底線 - 不可以有特殊字元,例如
@、$、%,也不可以有連字號- - 區分大小寫:
Hello和hello是兩個不同的識別字 - 不可以使用關鍵字(保留字)
| 名稱 | 合格嗎 | 原因 |
|---|---|---|
ab10c、abc_DE、_abc、_ |
合格 | 以文字或底線開頭 |
99、9abc |
不合格 | 以數字開頭 |
x+y、a@ |
不合格 | 含有特殊字元 |
for |
形式合格,但不能用 | 是關鍵字 |
Python 3 的關鍵字(可以用 import keyword 再 print(keyword.kwlist) 列出來):
False |
None |
True |
and |
as |
assert |
async |
await |
break |
class |
continue |
def |
del |
elif |
else |
except |
finally |
for |
from |
global |
if |
import |
in |
is |
lambda |
nonlocal |
not |
or |
pass |
raise |
return |
try |
while |
with |
yield |
命名慣例:變數名稱以小寫為主,多個單字用底線連接(
student_name);首字大寫的寫法通常留給類別(class)。
檢查識別字與關鍵字
keyword.iskeyword() 檢查一個字是不是關鍵字,字串的 .isidentifier() 檢查它在形式上能不能當識別字。注意 "for".isidentifier() 是 True,但 for 仍然不能當變數名稱。
算術運算子
| 運算子 | 說明 | 範例 | 結果 |
|---|---|---|---|
+ |
加法或正號 | 12 + 34 |
46 |
- |
減法或負號 | 34 - 12 |
22 |
* |
乘法 | 16.4 * 5 |
82.0 |
/ |
除法,結果一定是浮點數 | 16 / 4 |
4.0 |
// |
整數除法,捨棄小數部分 | 9 // 2 |
4 |
% |
求餘數 | 17 % 6 |
5 |
** |
次方 | 9 ** 2 |
81 |
// 遇到負數時是地板除法(floored):取「比較小」的那個整數,所以 -9 // 2 是 -5,不是 -4。
只要有一個運算元是浮點數,// 和 % 的結果也會是浮點數,例如 9.0 // 2 是 4.0。
Python 還有比較、邏輯、成員、身分、位元等運算子,Module 04 會介紹;這一課先專心在算術與指定運算子。
基本數學運算
這是投影片 Demo 的程式檔版本。播放前先猜猜每一行會印出什麼,特別是 16 / 4、16 // 4.0 和負數的 //。
指定運算子
把「運算之後再指定回自己」縮寫成一個運算子:
| 運算子 | 範例 | 相當於 |
|---|---|---|
= |
c = a + b |
單純指定 |
+= |
c += a |
c = c + a |
-= |
c -= a |
c = c - a |
*= |
c *= a |
c = c * a |
/= |
c /= a |
c = c / a |
%= |
c %= a |
c = c % a |
**= |
c **= a |
c = c ** a |
//= |
c //= a |
c = c // a |
Python 沒有
x++、x--。x++會是語法錯誤;--x則被當成「負負得正」,x 的值完全不會改變。
指定運算子實際操作
一步一步看 x 和 y 的值怎麼變化。第 7 行的 --x 看起來像遞減,其實不是;看看 x 的值有沒有改變。
海象運算子 :=
Python 3.8 加入了海象運算子 :=(The Walrus Operator,因為 := 像一隻橫躺的海象),
正式名稱是指定運算式(Assignment Expression):在一個運算式「裡面」指定值,並把這個值當作運算式的結果。
# 不使用海象運算子:input() 要寫兩次
current = input('Write something: ')
while current != 'quit':
words.append(current)
current = input('Write something: ')
# 使用海象運算子:讀入、存起來、比較,一次完成
while (current := input('Write something: ')) != 'quit':
words.append(current)
注意兩件事:
- 單純要指定值時,請用一般的
=;直接寫x := 5當成一行敘述會是語法錯誤 - 海象運算子適合「需要這個值、同時又要把它留下來」的情況,例如
while的條件、print(count := len(words))
海象運算子:一邊讀入一邊判斷
程式會讀三行輸入:apple、banana、quit。注意第 5 行每執行一次,current 就被指定成新讀到的文字,接著立刻拿來和 "quit" 比較。下方可以改輸入內容再跑一次。
想一想:算術運算
下面的程式會印出什麼?
print(-9 // 2)
下面的程式會印出什麼?
print(17 % 6, 2 ** 3, 10 / 5)
下面的程式會印出什麼?
x = 10
x //= 3
x **= 2
print(x)
想一想:變數與識別字
下面哪一個可以當作變數名稱?
下面的程式會印出什麼?
a, b = 1, 2
a, b = b, a + b
print(a, b)
下面的程式會印出什麼?
x = 4
print(--x, x)
實作:把秒數換算成時、分、秒
seconds = 3725 秒是幾小時幾分幾秒?用 // 和 % 算出 h、m、s,讓程式印出 1 小時 2 分 5 秒。改成其他秒數也要算得對。
重點精華回顧
- 變數是名稱,
=讓名稱指向一個物件;不需要宣告,同一個名稱可以重新指向其他物件。 - 多重指定:
x = y = z = 1、a, b, c = 1, 2, "John";交換變數用a, b = b, a。 - 識別字:文字或底線開頭、區分大小寫、不能有特殊字元、不能用關鍵字(
keyword.kwlist)。 - 算術運算子:
+ - * / // % **;/一定得到浮點數,//遇到負數是地板除法。 - 指定運算子:
+=、-=、*=、/=、%=、**=、//=;Python 沒有++、--。 - 海象運算子
:=:在運算式裡同時指定值,常用在while條件;單純指定請用=。