變數、數字與文字:給生活事物貼標籤
如果老師叫你背下全班 40 個人的電話號碼,你做得到嗎?
大概背到第五個就開始把第一個忘了吧 _(´ཀ`」 ∠)_
電腦也有一樣的問題:它需要一個方法來「記住」資料。而且不只要記住,還要能隨時拿出來用。這就是變數(Variable)存在的理由。
除了變數,我們還會碰到一個讓初學者翻車率最高的陷阱:資料型別(Data Type)。
還記得上一節我留了一個伏筆:input() 讀進來的東西「永遠是文字」這個解釋嗎?這一節就會解釋清楚給你聽。

📷 圖 5:學生想記40個電話號碼腦袋爆炸的四格漫畫(AI 製圖)
💡 📋 學習目標
看完這一節,希望你將能夠:
- 了解什麼是變數(Variable),以及它為什麼是程式的基礎
- 分辨三種基礎資料型別:
int、float、str - 學會用
int()做型別轉換,解決input()的「萬物皆字串」問題 - 熟練四則運算、整數除法
//、取餘數% - 解一道飲料店收銀機的 Judge 題!
變數:給資料一個名字
在程式的世界裡,幾乎所有事情都從「記住一筆資料」開始。變數就是 Python 幫你記東西的方式,而且比你想像的簡單很多。
為什麼需要變數?
電腦的記憶體裡,每一筆資料的存放位置都有一個地址,長得像 0x7FFF5B2A4C10 這種鬼東西。
「老師,你確定這是地址不是亂碼? Σ(゚Д゚;≡;゚д゚) 」
我很確定,這就是真實的記憶體位址。但沒有人類記得住這種東西。所以我們需要一個「翻譯」:給這個地址取一個人看得懂的名字。這個名字,就是變數(Variable)。
聽起來有點抽象?讓我們用一個你每天都會碰到的東西來比喻。
生活比喻:置物櫃
想像學校的置物櫃:
- 每個櫃子有一個編號(= 記憶體位址,像 0x7FFF...)
- 你在櫃子上貼了一張標籤,寫著「數學課本」(= 變數名稱)
- 打開櫃子,裡面放的東西就是資料(= 變數的值)
以後你要找數學課本,不用記住櫃子編號,只要找「數學課本」這張標籤就好。
實際操作
比喻聽起來很合理,但在 Python 裡到底要怎麼「貼標籤」?其實就一行:
name = "小明"這行做了什麼事?
- 在記憶體裡找一個空位,放進文字
"小明" - 在這個空位上貼了一張標籤,叫做
name
從此以後,你只要寫 name,Python 就知道你在說的是 "小明"。
等號 = 不是「等於」!
在數學課,= 代表「等於」。但在程式裡,= 代表的是「指派(Assign)」,把右邊的東西塞進左邊的變數。
x = 5 # 把 5 放進 x 這個盒子
x = 10 # 撕掉舊標籤,把 10 放進去(5 就被丟掉了)
print(x) # 印出 10我知道,數學老師如果看到 x = x + 1 大概會崩潰——因為在數學裡這個方程式無解。
但在程式裡,它的意思是「把 x 目前的值加 1,然後存回 x」。完全合理 (๑ơ ₃ ơ)♥
變數命名規則
| 規則 | 範例 |
|---|---|
| ✅ 用英文字母、數字、底線 | score, my_name, player1 |
| ❌ 不能用數字開頭 | 1st_place → 錯! |
| ❌ 不能有空格 | my name → 錯!用 my_name |
| ❌ 不能用 Python 保留字 | print, if, for → 這些已經被 Python 佔用了 |
💡 建議:變數名稱用英文,取有意義的名字。score 比 s 好,student_name 比 x 好。未來回頭看程式碼的時候,你會感謝現在的自己。
什麼是保留字?
Python 有一些單字已經被語言本身「佔用」了,例如 if、for、while、return、True、False 等等。這些叫做保留字(Keywords),你不能拿它們當變數名稱。如果你不小心寫了 for = 10,Python 會直接報錯。完整的保留字清單可以在附錄中查到。

📷 圖 6:置物櫃比喻變數的概念圖(AI 製圖)
好,你學會貼標籤了:變數就是給資料取個名字,方便你隨時拿來用。但你有沒有想過,不同種類的資料能做的事情也不一樣?數字可以加減乘除,文字呢?如果你分不清「數字」跟「長得像數字的文字」,後面會踩到一個超經典的坑⋯⋯
資料型別:數字跟文字不一樣
你已經會用變數存東西了,但不是所有東西都長得一樣。數字和文字在 Python 眼中是完全不同的物種,搞混了就會出事。
為什麼要分型別?
因為「能做的運算」不同。
想想看:3 + 5 = 8,這是數學,完全合理。
但是 蘋果 + 橘子 = ? ,你要怎麼加?
在 Python 裡,每一筆資料都有一個「型別」,告訴電腦:這筆資料是數字、文字、還是其他東西。型別不同,能做的事就不一樣。
三種基礎型別
認識一下 Python 最常見的三種資料型別。簡單來說:沒有小數點的數字是 int,有小數點的是 float,用引號包起來的就是 str。
| 型別 | 全名 | 範例 | 特徵 |
|---|---|---|---|
int | Integer(整數) | 1, 42, -7, 0 | 沒有小數點的數字 |
float | Floating Point(浮點數) | 3.14, 0.5, -2.7 | 有小數點的數字 |
str | String(字串) | "Hello", "123", "你好" | 用引號包起來的文字 |
你可以用 type() 來查看一筆資料的型別:
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("Hello")) # <class 'str'>看起來很單純對吧?三種型別你都會分辨了,不過在進入下個陷阱之前,先看一個跟字串有關的小知識:原來字串也能做運算。
字串也能做運算
數字會做加減乘除,字串其實也能做兩種運算,只是意義跟數字不一樣。
「字串會做加法?這聽起來有點玄 (・∀・)? 」
別緊張,看完範例你就知道意思了。先從「相加」開始。
字串相加 +:把兩段文字串接起來
print("Hello" + " " + "World")輸出:
Hello World字串的 + 不是「數學上的加」,而是串接(Concatenation):把兩段文字黏在一起,照順序拼成一個新字串。
greeting = "你好" + "," + "小明"
print(greeting)輸出:
你好,小明要注意的是,串接不會自動補空白。"Hello" + "World" 會得到 "HelloWorld",中間是黏在一起的;想要中間有空白,得自己加一段 " "。
字串乘整數 *:重複 N 次
print("*" * 5)輸出:
*****字串乘整數 N,意思是「把這個字串重複 N 次接起來」。這對印分隔線、印圖案非常好用:
print("abc" * 3)
print("-" * 20)輸出:
abcabcabc
--------------------「老師,那 5 * "abc" 順序顛倒可以嗎? ʅ(´◔౪◔)ʃ 」
可以喔,5 * "abc" 跟 "abc" * 5 結果一樣,Python 對「字串 × 整數」跟「整數 × 字串」兩種寫法都接受。
同樣的符號、不同的意義
+ 跟 * 在數字跟字串上做的事情完全不同:
| 表達式 | 結果 | 為什麼 |
|---|---|---|
3 + 5 | 8 | 數字相加 |
"3" + "5" | "35" | 字串串接(不是相加!) |
2 * 4 | 8 | 數字相乘 |
"ab" * 4 | "abababab" | 字串重複 4 次 |
Python 讓同一個符號在不同型別上做不同的事,這個現象有個專有名詞叫運算子重載(Operator Overloading)。名字聽起來很硬,其實就是「同一個按鈕,看你按的是哪種型別,就做不同的事情」。現在記不住術語沒關係,會用就好 ╮(╯_╰)╭
常見錯誤
❌ 字串跟數字不能直接相加
print("abc" + 1) # ❌ TypeError: can only concatenate str (not "int") to str+ 兩邊必須是同一種型別才能用。如果你要把數字接在字串後面,得先做型別轉換——把數字變成字串再串接。型別轉換是下一個小節(「input() 的型別陷阱」之後)的主題,這裡先記得「兩邊型別要一致」就好。
❌ 字串乘 0 會得到空字串
print("abc" * 0) # 輸出空字串 ""不會報錯,但輸出空無一物。* 0 的意思是「重複 0 次」,結果就是什麼都沒有。順帶一提,乘負整數(例如 "abc" * -3)也會得到空字串,Python 把它當成 0 次處理,不會報錯。
❌ 字串只能乘整數,不能乘小數
print("abc" * 1.5) # ❌ TypeError: can't multiply sequence by non-int of type 'float'「重複 1.5 次」這件事在語意上不存在 (´-﹏-`;),所以 Python 直接不允許。
範例對照表
| 表達式 | 結果 | 備註 |
|---|---|---|
"Hello" + "World" | "HelloWorld" | 字串串接,不會自動補空白 |
"abc" * 3 | "abcabcabc" | 重複 3 次 |
"abc" * 0 | "" | 空字串 |
"abc" + 1 | TypeError | 字串不能與整數相加 |
"abc" * 1.5 | TypeError | 重複次數必須是整數 |
為什麼現在學這個?
因為下一章學迴圈時,你會看到 print("*" * n) 這種「印 n 個星號」的小技巧,這就是字串乘法的常見用法。先學會這個,後面看到才不會一頭霧水。
到這裡你已經會用三種型別,也熟悉字串的兩個運算了。但接下來這個陷阱,幾乎每個初學者都會踩到。
input() 的型別陷阱 💣
還記得上一節說的嗎?input() 讀進來的東西永遠是字串。
這代表什麼?看這段程式碼:
a = input() # 使用者輸入 1
b = input() # 使用者輸入 2
print(a + b)你覺得答案是 3 嗎?
錯!答案是 12。
因為 a 和 b 都是字串 "1" 和 "2",而字串的 + 不是「相加」,是「串接」:把兩段文字黏在一起。
「什麼鬼啊!那要怎麼做真正的加法? ΩДΩ 」
別急,解法其實很簡單:你需要型別轉換(Type Conversion),把字串「變回」數字。

📷 圖 7:學生發現 1+2 等於 12 的驚愕四格漫畫(AI 製圖)
型別轉換
所謂型別轉換,就是把一種資料型別「變身」成另一種。最常用的場景就是把 input() 讀進來的字串轉成數字,好讓 Python 能做數學運算。
用 int() 可以把字串轉成整數:
a = input() # 讀取使用者輸入(字串 "1")
a = int(a) # 把字串 "1" 轉成整數 1還不夠直覺?覺得太囉唆?
還有一種更「Python」的寫法,一行搞定:
a = int(input()) # 讀取輸入,同時轉成整數等等,int(input()) 兩層括號包在一起,Python 怎麼知道先做哪個?
還記得上一節的口訣嗎?由內而外。跟 print(1+1) 先算 1+1 再印是同一個道理:
- Python 先執行最裡面的
input(),暫停等你打字。假設你輸入了1,拿到字串"1" - 再把
"1"交給外面的int(),轉成整數1 - 最後用
=把整數1存進變數a
這個「由內而外」的模式你會一直遇到,習慣就好。
現在再試一次:
a = int(input()) # 使用者輸入 1 → 整數 1
b = int(input()) # 使用者輸入 2 → 整數 2
print(a + b) # 輸出 3 ✅這次答案就是 3 了 (๑•̀ㅂ•́)و✧
不過先別高興太早,有個小地雷要注意:
⚠️ **注意**
如果使用者輸入的不是數字(例如 "abc"),int() 會直接報錯。
不過在 Judge 題目裡,測試資料都是合法的,所以暫時不用擔心。
到目前為止,你知道 int 是整數、float 是浮點數、str 是字串,也學會用 int() 拆掉 input() 的字串炸彈了。接下來的問題是:拿到數字之後,能做什麼?加減乘除你應該猜得到,但 Python 還藏了兩個 Judge 題必備的秘密武器。
四則運算與取餘數
Python 當然會加減乘除,但除了你熟悉的四則運算之外,還有兩個在 Judge 題目裡超好用的運算子。讓我們從最簡單的開始。
基本運算
加減乘你應該秒懂,跟數學課一模一樣:
print(3 + 5) # 8
print(10 - 4) # 6
print(6 * 7) # 42接下來輪到除法了,不過這裡 Python 會給你一個小小的意外。
除法的小驚喜
除法 / 看起來很直覺,但 Python 有一個小陷阱:
print(10 / 2) # 5.0(不是 5!)等等,5.0?為什麼不是 5? (・∀・)?
因為 Python 的 / 永遠回傳 float(浮點數),即使能整除也一樣。這是 Python 的設計,你就接受它吧。
如果你就是想要整數結果,不想要那個 .0 呢?Python 幫你準備了另一組工具。
整數除法 // 與取餘數 %
這兩個是 Judge 題的超級好朋友。
print(10 // 3) # 3(只取商,丟掉餘數)
print(10 % 3) # 1(只取餘數,丟掉商)光看 // 和 % 的符號可能覺得很抽象,但你生活中其實一直在做這兩個運算。
生活比喻:你有 100 元,要平分給 3 個朋友。
100 // 3→ 每人拿33元(整數除法 = 每人分到多少)100 % 3→ 剩下1元(取餘數 = 分完剩多少)
money = 100
friends = 3
each = money // friends # 33
leftover = money % friends # 1
print("每人", each, "元,剩", leftover, "元")輸出:
每人 33 元,剩 1 元`//` 和 `/` 別搞混!
/ 是一般除法,結果永遠是 float;// 是整數除法,只取商。另外要注意:// 對負數是向下取整(往負無窮方向),例如 -7 // 2 的結果是 -4 而不是 -3。剛開始不需要背這條規則,但碰到負數的時候記得回來看一眼。
最後還有一件事:當一行裡面同時出現加減乘除,Python 怎麼決定先算哪個?
運算優先順序
跟數學課一樣:先乘除後加減,括號最優先。
print(2 + 3 * 4) # 14(不是 20!先算 3*4=12,再加 2)
print((2 + 3) * 4) # 20(括號先算 2+3=5,再乘 4)如果你不確定優先順序,就加括號。加括號永遠不會錯,而且程式碼更好讀 (b ᵔ▽ᵔ)b

📷 圖 8:整數除法和取餘數的對比概念圖(AI 製圖)
好,武器都齊了:變數讓你記住資料,int(input()) 讓你正確讀取整數,四則運算和 //、% 讓你做各種計算。現在來把這些組合起來,解你的第二道 Judge 題!
Judge 解題實戰:飲料店的收銀機
這題會用到你剛學的 int(input())、變數和乘法。跟著 IPO 三步驟走,你會發現其實比想像中簡單。
題目說明
學校旁邊的飲料店需要一台收銀機。
- Input:第一行為珍珠奶茶的數量(整數),第二行為每杯單價(整數)
- Output:輸出總金額
範例
| Input | Output |
|---|---|
3(數量)55(單價) | 165 |
老師的建議
先試著往前翻找資訊,自己完成挑戰!
若真的卡關太久,再往下看詳解吧!
還記得上一節學的 IPO 思考法嗎?先拆解問題,再動手寫程式。
Step 1:分析 IPO
- I:讀兩個整數 — 數量和單價
- P:兩個數字相乘
- O:印出結果
Step 2:寫程式碼
分析完 IPO,把每一步直接翻成 Python:
# I:讀取輸入
quantity = int(input()) # 第一行:數量
price = int(input()) # 第二行:單價
# P:計算總金額
total = quantity * price
# O:輸出結果
print(total)寫完了,但每一行到底在做什麼?讓我們逐行拆開來看。
Step 3:逐行解讀
quantity = int(input()):讀一行輸入,用int()轉成整數,存進quantityprice = int(input()):同上,存進pricetotal = quantity * price:計算總金額print(total):印出來
Step 4:常見錯誤
❌ 忘記 int() 轉換
看看這段少了 int() 的程式碼會發生什麼事:
quantity = input()
price = input()
total = quantity * price # ❌ 字串不能相乘!會報錯如果你忘記 int(),quantity 和 price 都是字串,字串不能做乘法(嚴格來說字串 × 整數可以,但字串 × 字串會報錯)。
❌ 搞混哪一行是什麼
題目說「第一行是數量,第二行是單價」,你的程式讀取順序必須一致。如果顛倒了,數量和單價就搞混了,答案自然也是錯的。
❗ 📌 **核心觀念**
永遠記得用 int(input()) 讀取整數輸入。
這個組合技會伴隨你走過整門課。
收銀機搞定了!你已經成功把「讀取輸入 → 計算 → 輸出」的流程跑了一遍。接下來三道練習題會讓你用不同的運算把這套流程練到熟。
自己動手試試!
下面三題都是變數和運算的練習。一樣不給解答,靠你自己 ╮(╯_╰)╭
類題一:段考成績平均
三科成績取平均:小心除法的結果!
💡 提示:三個數相加再除以 3。注意用 / 除法結果會自動帶小數點。輸出要保留一位小數,你可以用 round(result, 1) 來四捨五入到小數點後一位,或者試試看 f"{result:.1f}" 這個寫法:這叫做 f-string 格式化,雖然我們還沒正式教,但你可以先偷學一招 (^_−)−☆
平均算完了?接下來換個場景。
類題二:便利商店找零
付款金額減掉商品金額就是找零,超級簡單。
💡 提示:跟飲料店的收銀機幾乎一樣,只是運算從乘法變成減法。
最後一題,輪到 // 和 % 上場了。
類題三:秒數轉換器
把總秒數轉成幾分幾秒——這題就是 // 和 % 的最佳練習場!
💡 提示:分鐘數 = 總秒數 // 60,剩餘秒數 = 總秒數 % 60。
這一節的內容不少,讓我們快速複習一下你學到了什麼。
本節小結
🎯 重點回顧:
- 變數就是給資料取個名字,方便你存取和重複使用
=是指派(Assign),不是數學上的等於- 資料型別決定了資料能做什麼運算:
int(整數)、float(浮點數)、str(字串) input()讀進來的永遠是字串,需要用int()轉換才能做數學運算//是整數除法(只取商),%是取餘數(只取餘)
下一節:「布林值與流程控制」——我們要讓程式學會「做選擇」。你每天早上看天氣決定穿什麼,程式也可以做一樣的事。而且你會發現,"1" + "2" = "12" 其實只是冰山一角,真正的麻煩是⋯⋯電腦要怎麼判斷「一個數字是不是偶數」?(提示:% 就是關鍵 (^_−)−☆ )