Skip to content

變數、數字與文字:給生活事物貼標籤

如果老師叫你背下全班 40 個人的電話號碼,你做得到嗎?

大概背到第五個就開始把第一個忘了吧 _(´ཀ`」 ∠)_

電腦也有一樣的問題:它需要一個方法來「記住」資料。而且不只要記住,還要能隨時拿出來用。這就是變數(Variable)存在的理由。

除了變數,我們還會碰到一個讓初學者翻車率最高的陷阱:資料型別(Data Type)

還記得上一節我留了一個伏筆:input() 讀進來的東西「永遠是文字」這個解釋嗎?這一節就會解釋清楚給你聽。

📷 圖 5:學生想記40個電話號碼腦袋爆炸的四格漫畫(AI 製圖)

📷 圖 5:學生想記40個電話號碼腦袋爆炸的四格漫畫(AI 製圖)

💡 📋 學習目標

看完這一節,希望你將能夠:

  1. 了解什麼是變數(Variable),以及它為什麼是程式的基礎
  2. 分辨三種基礎資料型別:intfloatstr
  3. 學會用 int() 做型別轉換,解決 input() 的「萬物皆字串」問題
  4. 熟練四則運算、整數除法 //、取餘數 %
  5. 解一道飲料店收銀機的 Judge 題!

變數:給資料一個名字

在程式的世界裡,幾乎所有事情都從「記住一筆資料」開始。變數就是 Python 幫你記東西的方式,而且比你想像的簡單很多。

為什麼需要變數?

電腦的記憶體裡,每一筆資料的存放位置都有一個地址,長得像 0x7FFF5B2A4C10 這種鬼東西。

「老師,你確定這是地址不是亂碼? Σ(゚Д゚;≡;゚д゚) 」

我很確定,這就是真實的記憶體位址。但沒有人類記得住這種東西。所以我們需要一個「翻譯」:給這個地址取一個人看得懂的名字。這個名字,就是變數(Variable)

聽起來有點抽象?讓我們用一個你每天都會碰到的東西來比喻。

生活比喻:置物櫃

想像學校的置物櫃:

  • 每個櫃子有一個編號(= 記憶體位址,像 0x7FFF...)
  • 你在櫃子上貼了一張標籤,寫著「數學課本」(= 變數名稱)
  • 打開櫃子,裡面放的東西就是資料(= 變數的值)

以後你要找數學課本,不用記住櫃子編號,只要找「數學課本」這張標籤就好。

實際操作

比喻聽起來很合理,但在 Python 裡到底要怎麼「貼標籤」?其實就一行:

python
name = "小明"

這行做了什麼事?

  1. 在記憶體裡找一個空位,放進文字 "小明"
  2. 在這個空位上貼了一張標籤,叫做 name

從此以後,你只要寫 name,Python 就知道你在說的是 "小明"

等號 = 不是「等於」!

在數學課,= 代表「等於」。但在程式裡,= 代表的是「指派(Assign)」,把右邊的東西塞進左邊的變數。

python
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 佔用了

💡 建議:變數名稱用英文,取有意義的名字。scores 好,student_namex 好。未來回頭看程式碼的時候,你會感謝現在的自己。

什麼是保留字?

Python 有一些單字已經被語言本身「佔用」了,例如 ifforwhilereturnTrueFalse 等等。這些叫做保留字(Keywords),你不能拿它們當變數名稱。如果你不小心寫了 for = 10,Python 會直接報錯。完整的保留字清單可以在附錄中查到。

📷 圖 6:置物櫃比喻變數的概念圖(AI 製圖)

📷 圖 6:置物櫃比喻變數的概念圖(AI 製圖)


好,你學會貼標籤了:變數就是給資料取個名字,方便你隨時拿來用。但你有沒有想過,不同種類的資料能做的事情也不一樣?數字可以加減乘除,文字呢?如果你分不清「數字」跟「長得像數字的文字」,後面會踩到一個超經典的坑⋯⋯

資料型別:數字跟文字不一樣

你已經會用變數存東西了,但不是所有東西都長得一樣。數字和文字在 Python 眼中是完全不同的物種,搞混了就會出事。

為什麼要分型別?

因為「能做的運算」不同。

想想看:3 + 5 = 8,這是數學,完全合理。

但是 蘋果 + 橘子 = ? ,你要怎麼加?

在 Python 裡,每一筆資料都有一個「型別」,告訴電腦:這筆資料是數字、文字、還是其他東西。型別不同,能做的事就不一樣。

三種基礎型別

認識一下 Python 最常見的三種資料型別。簡單來說:沒有小數點的數字是 int,有小數點的是 float,用引號包起來的就是 str

型別全名範例特徵
intInteger(整數)1, 42, -7, 0沒有小數點的數字
floatFloating Point(浮點數)3.14, 0.5, -2.7有小數點的數字
strString(字串)"Hello", "123", "你好"用引號包起來的文字

你可以用 type() 來查看一筆資料的型別:

python
print(type(42))       # <class 'int'>
print(type(3.14))     # <class 'float'>
print(type("Hello"))  # <class 'str'>

看起來很單純對吧?三種型別你都會分辨了,不過在進入下個陷阱之前,先看一個跟字串有關的小知識:原來字串也能做運算。

字串也能做運算

數字會做加減乘除,字串其實也能做兩種運算,只是意義跟數字不一樣。

「字串會做加法?這聽起來有點玄 (・∀・)? 」

別緊張,看完範例你就知道意思了。先從「相加」開始。

字串相加 +:把兩段文字串接起來

python
print("Hello" + " " + "World")

輸出:

Hello World

字串的 + 不是「數學上的加」,而是串接(Concatenation):把兩段文字黏在一起,照順序拼成一個新字串。

python
greeting = "你好" + "," + "小明"
print(greeting)

輸出:

你好,小明

要注意的是,串接不會自動補空白。"Hello" + "World" 會得到 "HelloWorld",中間是黏在一起的;想要中間有空白,得自己加一段 " "

字串乘整數 *:重複 N 次

python
print("*" * 5)

輸出:

*****

字串乘整數 N,意思是「把這個字串重複 N 次接起來」。這對印分隔線、印圖案非常好用:

python
print("abc" * 3)
print("-" * 20)

輸出:

abcabcabc
--------------------

「老師,那 5 * "abc" 順序顛倒可以嗎? ʅ(´◔౪◔)ʃ 」

可以喔,5 * "abc""abc" * 5 結果一樣,Python 對「字串 × 整數」跟「整數 × 字串」兩種寫法都接受。

同樣的符號、不同的意義

+* 在數字跟字串上做的事情完全不同:

表達式結果為什麼
3 + 58數字相加
"3" + "5""35"字串串接(不是相加!)
2 * 48數字相乘
"ab" * 4"abababab"字串重複 4 次

Python 讓同一個符號在不同型別上做不同的事,這個現象有個專有名詞叫運算子重載(Operator Overloading)。名字聽起來很硬,其實就是「同一個按鈕,看你按的是哪種型別,就做不同的事情」。現在記不住術語沒關係,會用就好 ╮(╯_╰)╭

常見錯誤

字串跟數字不能直接相加

python
print("abc" + 1)   # ❌ TypeError: can only concatenate str (not "int") to str

+ 兩邊必須是同一種型別才能用。如果你要把數字接在字串後面,得先做型別轉換——把數字變成字串再串接。型別轉換是下一個小節(「input() 的型別陷阱」之後)的主題,這裡先記得「兩邊型別要一致」就好。

字串乘 0 會得到空字串

python
print("abc" * 0)   # 輸出空字串 ""

不會報錯,但輸出空無一物。* 0 的意思是「重複 0 次」,結果就是什麼都沒有。順帶一提,乘負整數(例如 "abc" * -3)也會得到空字串,Python 把它當成 0 次處理,不會報錯。

字串只能乘整數,不能乘小數

python
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" + 1TypeError字串不能與整數相加
"abc" * 1.5TypeError重複次數必須是整數

為什麼現在學這個?

因為下一章學迴圈時,你會看到 print("*" * n) 這種「印 n 個星號」的小技巧,這就是字串乘法的常見用法。先學會這個,後面看到才不會一頭霧水。

到這裡你已經會用三種型別,也熟悉字串的兩個運算了。但接下來這個陷阱,幾乎每個初學者都會踩到。

input() 的型別陷阱 💣

還記得上一節說的嗎?input() 讀進來的東西永遠是字串

這代表什麼?看這段程式碼:

python
a = input()   # 使用者輸入 1
b = input()   # 使用者輸入 2
print(a + b)

你覺得答案是 3 嗎?

錯!答案是 12

因為 ab 都是字串 "1""2",而字串的 + 不是「相加」,是「串接」:把兩段文字黏在一起。

「什麼鬼啊!那要怎麼做真正的加法? ΩДΩ 」

別急,解法其實很簡單:你需要型別轉換(Type Conversion),把字串「變回」數字。

📷 圖 7:學生發現 1+2 等於 12 的驚愕四格漫畫(AI 製圖)

📷 圖 7:學生發現 1+2 等於 12 的驚愕四格漫畫(AI 製圖)

型別轉換

所謂型別轉換,就是把一種資料型別「變身」成另一種。最常用的場景就是把 input() 讀進來的字串轉成數字,好讓 Python 能做數學運算。

int() 可以把字串轉成整數:

python
a = input()       # 讀取使用者輸入(字串 "1")
a = int(a)        # 把字串 "1" 轉成整數 1

還不夠直覺?覺得太囉唆?

還有一種更「Python」的寫法,一行搞定:

python
a = int(input())  # 讀取輸入,同時轉成整數

等等,int(input()) 兩層括號包在一起,Python 怎麼知道先做哪個?

還記得上一節的口訣嗎?由內而外。跟 print(1+1) 先算 1+1 再印是同一個道理:

  1. Python 先執行最裡面的 input(),暫停等你打字。假設你輸入了 1,拿到字串 "1"
  2. 再把 "1" 交給外面的 int(),轉成整數 1
  3. 最後用 = 把整數 1 存進變數 a

這個「由內而外」的模式你會一直遇到,習慣就好。

現在再試一次:

python
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 題目裡超好用的運算子。讓我們從最簡單的開始。

基本運算

加減乘你應該秒懂,跟數學課一模一樣:

python
print(3 + 5)    # 8
print(10 - 4)   # 6
print(6 * 7)    # 42

接下來輪到除法了,不過這裡 Python 會給你一個小小的意外。

除法的小驚喜

除法 / 看起來很直覺,但 Python 有一個小陷阱:

python
print(10 / 2)   # 5.0(不是 5!)

等等,5.0?為什麼不是 5? (・∀・)?

因為 Python 的 / 永遠回傳 float(浮點數),即使能整除也一樣。這是 Python 的設計,你就接受它吧。

如果你就是想要整數結果,不想要那個 .0 呢?Python 幫你準備了另一組工具。

整數除法 // 與取餘數 %

這兩個是 Judge 題的超級好朋友。

python
print(10 // 3)   # 3(只取商,丟掉餘數)
print(10 % 3)    # 1(只取餘數,丟掉商)

光看 //% 的符號可能覺得很抽象,但你生活中其實一直在做這兩個運算。

生活比喻:你有 100 元,要平分給 3 個朋友。

  • 100 // 3 → 每人拿 33 元(整數除法 = 每人分到多少)
  • 100 % 3 → 剩下 1 元(取餘數 = 分完剩多少)
python
money = 100
friends = 3
each = money // friends   # 33
leftover = money % friends # 1
print("每人", each, "元,剩", leftover, "元")

輸出:

每人 33 元,剩 1 元

`//` 和 `/` 別搞混!

/ 是一般除法,結果永遠是 float// 是整數除法,只取商。另外要注意:// 對負數是向下取整(往負無窮方向),例如 -7 // 2 的結果是 -4 而不是 -3。剛開始不需要背這條規則,但碰到負數的時候記得回來看一眼。

最後還有一件事:當一行裡面同時出現加減乘除,Python 怎麼決定先算哪個?

運算優先順序

跟數學課一樣:先乘除後加減,括號最優先

python
print(2 + 3 * 4)     # 14(不是 20!先算 3*4=12,再加 2)
print((2 + 3) * 4)   # 20(括號先算 2+3=5,再乘 4)

如果你不確定優先順序,就加括號。加括號永遠不會錯,而且程式碼更好讀 (b ᵔ▽ᵔ)b

📷 圖 8:整數除法和取餘數的對比概念圖(AI 製圖)

📷 圖 8:整數除法和取餘數的對比概念圖(AI 製圖)


好,武器都齊了:變數讓你記住資料,int(input()) 讓你正確讀取整數,四則運算和 //% 讓你做各種計算。現在來把這些組合起來,解你的第二道 Judge 題!

Judge 解題實戰:飲料店的收銀機

這題會用到你剛學的 int(input())、變數和乘法。跟著 IPO 三步驟走,你會發現其實比想像中簡單。

題目說明

學校旁邊的飲料店需要一台收銀機。

  • Input:第一行為珍珠奶茶的數量(整數),第二行為每杯單價(整數)
  • Output:輸出總金額

範例

InputOutput
3(數量)
55(單價)
165

老師的建議

先試著往前翻找資訊,自己完成挑戰!

若真的卡關太久,再往下看詳解吧!

還記得上一節學的 IPO 思考法嗎?先拆解問題,再動手寫程式。

Step 1:分析 IPO

  • I:讀兩個整數 — 數量和單價
  • P:兩個數字相乘
  • O:印出結果

Step 2:寫程式碼

分析完 IPO,把每一步直接翻成 Python:

python
# I:讀取輸入
quantity = int(input())   # 第一行:數量
price = int(input())      # 第二行:單價

# P:計算總金額
total = quantity * price

# O:輸出結果
print(total)

寫完了,但每一行到底在做什麼?讓我們逐行拆開來看。

Step 3:逐行解讀

  1. quantity = int(input()):讀一行輸入,用 int() 轉成整數,存進 quantity
  2. price = int(input()):同上,存進 price
  3. total = quantity * price:計算總金額
  4. print(total):印出來

Step 4:常見錯誤

忘記 int() 轉換

看看這段少了 int() 的程式碼會發生什麼事:

python
quantity = input()
price = input()
total = quantity * price   # ❌ 字串不能相乘!會報錯

如果你忘記 int()quantityprice 都是字串,字串不能做乘法(嚴格來說字串 × 整數可以,但字串 × 字串會報錯)。

搞混哪一行是什麼

題目說「第一行是數量,第二行是單價」,你的程式讀取順序必須一致。如果顛倒了,數量和單價就搞混了,答案自然也是錯的。

❗ 📌 **核心觀念**

永遠記得用 int(input()) 讀取整數輸入。

這個組合技會伴隨你走過整門課。


收銀機搞定了!你已經成功把「讀取輸入 → 計算 → 輸出」的流程跑了一遍。接下來三道練習題會讓你用不同的運算把這套流程練到熟。

自己動手試試!

下面三題都是變數和運算的練習。一樣不給解答,靠你自己 ╮(╯_╰)╭

類題一:段考成績平均

三科成績取平均:小心除法的結果!

💡 提示:三個數相加再除以 3。注意用 / 除法結果會自動帶小數點。輸出要保留一位小數,你可以用 round(result, 1) 來四捨五入到小數點後一位,或者試試看 f"{result:.1f}" 這個寫法:這叫做 f-string 格式化,雖然我們還沒正式教,但你可以先偷學一招 (^_−)−☆

平均算完了?接下來換個場景。

類題二:便利商店找零

付款金額減掉商品金額就是找零,超級簡單。

💡 提示:跟飲料店的收銀機幾乎一樣,只是運算從乘法變成減法。

最後一題,輪到 //% 上場了。

類題三:秒數轉換器

把總秒數轉成幾分幾秒——這題就是 //% 的最佳練習場!

💡 提示:分鐘數 = 總秒數 // 60,剩餘秒數 = 總秒數 % 60。


這一節的內容不少,讓我們快速複習一下你學到了什麼。

本節小結

🎯 重點回顧:

  • 變數就是給資料取個名字,方便你存取和重複使用
  • = 是指派(Assign),不是數學上的等於
  • 資料型別決定了資料能做什麼運算:int(整數)、float(浮點數)、str(字串)
  • input() 讀進來的永遠是字串,需要用 int() 轉換才能做數學運算
  • // 是整數除法(只取商),% 是取餘數(只取餘)

下一節:「布林值與流程控制」——我們要讓程式學會「做選擇」。你每天早上看天氣決定穿什麼,程式也可以做一樣的事。而且你會發現,"1" + "2" = "12" 其實只是冰山一角,真正的麻煩是⋯⋯電腦要怎麼判斷「一個數字是不是偶數」?(提示:% 就是關鍵 (^_−)−☆ )