4.2 Python 是甚麼?(快速認識)
Python 是一種高階、通用的程式語言, 特色是語法接近英文、可讀性高,適合用於解難、學算法及編寫小工具。 一般情況下不需要先「編譯」成 .exe,直接用 Python 直譯器就可以執行(即「邊讀邊做」)。
Python 的特色(考試+實戰都常見)
易讀易寫
- 以縮排表示程式區塊(if / for / while)。
- 少括號、少符號,整體寫法清晰。
動態型別
- 變量一般毋須事先宣告
int/float。 - Python 會按目前的值自動判斷型別。
庫(library)多
- 內置:
abs()、round()、type()… - 常用模組:
math、random。
用途廣
- 學校:算法、偽代碼 → Python。
- 現實:自動化、資料處理、AI、網頁後端等。
第一個 Python 例子:輸出一句話
💡 print() 用於輸出;暫時當作「顯示結果」即可,之後 輸入與輸出 會再詳細講。
A. Python 一定要先宣告變量型別(例如 int/float)
B. Python 主要用縮排分辨程式區塊
C. Python 每行都必須以 ; 結尾
D. Python 只可以做網頁,不可以做其他用途
直譯器(Interpreter)
- 你寫的
.py程式會由 Python 直譯器逐行執行。 - 好處:修改後可以立即再跑,學習與除錯都更快。
課堂上你可以用 Thonny;本網頁亦使用 Skulpt 令你在瀏覽器直接執行 Python。
縮排不是裝飾
- Python 用縮排決定「邊幾行屬於同一個 if / for / while」。
- 如果縮排不一致,就會出
IndentationError。
4.2 變量與數據類型
變量(variable)好像貼上標籤的儲物箱,用來暫時存放數值或字串。Python 會根據放入的資料,自動判斷資料類型(int / float / bool / str)。
常見數據類型
int 整數
- … -2, -1, 0, 1, 2, 3 …
- 例:
length = 12
float 浮點數
- 帶有小數點的實數
- 例:
price = 56.5、-0.382
bool 布爾值
- 只有兩個可能的值:
True或False - 例:
passed = True
str 字串
- 一串文字,可以包括字母、數字及符號
- 例:
"ICT"、"Password123!"
命名規則與關鍵字
- 只能使用英文字母、數字及底線
_;第一個字元不可以是數字。 - 不要使用空格或奇怪符號,例如
mark%❌。 - 不可以使用 Python 關鍵字,例如
if、while、and、import等。 - 名稱應具備意義,例如
area、radius、bmi,避免只用a1、x2等看不出用途的名字。
示例:同一個變量可以儲存不同類型的數據
💡 提示:可以在 Thonny 輸入以上程式碼,觀察 Shell 顯示的資料類型。
系統會隨機產生一個 Python 數據值,請判斷它屬於 int、float、bool 還是 str。
目前數據值:(按「下一題」開始)
思考:上述程式會出錯,請先估計原因,再在 Thonny 中改正。
顯示提示
print("code")中有引號,因此會輸出字串code,而不是變量的內容(屬於邏輯問題,但不會令程式崩潰)。import是 Python 關鍵字,不可以用作變量名稱,會產生語法錯誤。
核心概念
- 變量(variable)是一個「名稱」,用來代表(指向)某個資料值,方便在程式中反覆使用。
- 指定運算(assignment):
name = value表示把右邊的值存入(或指派給)左邊的變量名稱。 - 可把它想成「貼上標籤」:
length這個標籤貼在數值12上,日後用length就能取回該值。
常見誤解
=在 Python 不是「等於」,而是「把右邊結果交給左邊變量」。真正的比較「是否相等」要用==。print("length")會輸出字串length;print(length)才會輸出變量內容。
動態型別(Dynamic Typing)
Python 會根據目前存放的值,自動判斷變量的資料類型,因此一般不需要像某些語言那樣先宣告 int、float 等型別。
你需要掌握的重點
- 同一個變量名稱可以在不同時間存放不同型別的值,但在課堂練習中應儘量保持一致,避免混亂。
type(x)可用來檢查目前型別,對除錯非常有用。
四大類型的用途與差異
- int(整數):不含小數點,例如 -2、0、15。常用於次數、計數、索引。
- float(浮點數):帶小數點的實數,例如 3.14、-0.5。常用於量度、平均數、公式計算。
- bool(布爾值):只有
True或False,常用於條件判斷(if / while)。 - str(字串):文字資料,必須以引號包圍,例如
"ICT"、'A+'。
常見混淆
"12"是字串,不可直接與數值做加減乘除;若要計算,需先轉型:int("12")或float("12")。
合法命名(必須遵守)
- 只能使用英文字母、數字及底線
_;且第一個字元不可以是數字。 - 不可包含空格或符號(例如
mark%)。 - 不可使用 Python 關鍵字(例如
if、while、import)。
良好習慣(建議遵守)
- 使用具意義名稱:
total_mark、radius、bmi。 - 以
snake_case(小寫+底線)命名,閱讀更清晰。 - 避免用
l、O等易混淆字母作為單字母變量。
常見錯誤
- NameError:使用了未定義的變量(例如拼錯變量名)。
- TypeError:型別不相容(例如字串與整數相加)。
- 把變量當成字串:誤用引號令程式輸出錯誤內容。
有效的除錯習慣
- 在關鍵位置加入
print()檢查變量內容。 - 同時印出
type(),快速判斷錯誤來源是否與型別有關。
4.2 數據類型轉換:int() / float() / str()
Python 讀入的資料通常是字串,需要透過「轉型函數」轉換為數值,才可以進行計算。
常用轉型函數
int(x):轉為整數(小數會截去小數部分;字串必須是整數形式)。float(x):轉為浮點數。str(x):轉為字串,方便與其他文字一併輸出。
例子 A:字串 → 整數
例子 B:失敗例子
因為 "12.1" 並不是「整數」格式,int() 無法處理。
小練習:先估結果,再到 Thonny 測試
int(12.9)→ ?float("7")→ ?str(3.14)→ ?
在下方輸入幾行程式,使用 int()、float()、str() 轉換不同資料,
再透過 Python 編譯器執行,看看在何種情況下會產生 ValueError,然後再改為正確寫法。
例子:int("12") 可以;但 int("12.3") 不可以;必須改用 float("12.3")。
這段程式用來計算平均分數,但會出錯,原因是 input() 取得的是字串。
請在下方用 int() 或 float() 改寫,然後用 Python 編譯器測試並自動核對答案。
顯示參考答案
關鍵原因
input() 取得的是「用戶輸入的文字」,因此 Python 會把它當作 字串(str)。若直接進行運算(例如加法、平均數),就會出現錯誤或得到不符合預期的結果。
例:不轉型會發生甚麼事?
正確做法:把輸入轉為數值後再計算。
常用轉型函數
int(x):轉為整數。若x是小數(float),會截去小數部分(不是四捨五入)。float(x):轉為浮點數,可保留小數。str(x):轉為字串,方便與文字一同輸出。
重要例子
提示:若需要四捨五入,應使用 round(),而非 int()。
何時會出現 ValueError?
- 當字串內容不符合目標型別格式,就會轉型失敗。
- 例如:
int("12.3")失敗,因為字串含小數點,不是整數格式。 - 例如:
float("abc")失敗,因為字串不是數字。
改正方向
- 若輸入可能有小數,使用
float()。 - 如需限制輸入格式,應在轉型前做檢查,或配合
try/except處理錯誤(進階)。
建議步驟
- 提示用戶輸入(清楚指明格式,例如「請輸入整數」)。
- 讀入字串(
input())。 - 轉型(
int()/float())。 - 進行計算。
- 輸出結果(必要時用
round()控制小數位)。
最常見的陷阱
- 字串的
+是「拼接」,數值的+才是「相加」。 - 因此:在計算前先轉型,是最穩妥的習慣。
快速自我檢查
- 若你不確定某個變量是字串還是數值,請立刻印出
type(x)。
4.2 運算符與算式
算式 = 數據 + 運算符。Python 支援加法、減法、乘法、除法、整數除法、餘數及乘冪等運算。
常見數學運算符
| 運算子 | 名稱 | 說明 | 例子 | 運算結果 |
|---|---|---|---|---|
+ |
加法 | 用於將兩個數值相加,結果為兩數之和。 常用於累積數值或計算總和。 | y = 1 + 2 |
3 |
- |
減法 | 用於計算兩個數值之間的差, 即以前面的數值減去後面的數值。 | y = 5 - 2 |
3 |
* |
乘法 | 用於計算兩個數值的乘積, 常見於重複加法或面積、總量的計算。 | y = 2 * 3 |
6 |
/ |
實數除法 | 用於進行除法運算, 不論能否整除,結果必定為實數(float)。 即使兩個操作數皆為整數,結果仍會包含小數部分(如適用)。 | 5 / 2 |
2.5 |
// |
整數除法 | 用於取得除法結果的整數部分, 會捨去小數部分,只保留商的整數值。 常用於索引、次數或計數用途。 | 5 // 2 |
2 |
% |
餘數(Modulo) | 用於計算整數除法後的餘數, 常用於判斷奇偶數、循環結構或分組問題。 | 10 % 3 |
1 |
** |
乘冪(指數運算) | 用於計算次方, 表示「底數」的「指數」次乘積, 常見於數學運算及科學計算。 | 2 ** 3 |
8 |
複合指定運算符
將運算符與 = 合併,寫法更簡潔:
- Q1:
10 // 3= ? - Q2:
10 % 3= ? - Q3:
2 ** 4= ?
按「下一題」產生一條算式,先自行計算,再在下方輸入答案。
核心概念
算式由「運算元(數值或變量)」與「運算符」組成。Python 會按運算優先次序計算,例如乘除通常先於加減。
建議做法
- 遇到較複雜算式,使用括號
()明確指出先後次序,避免誤解。 - 寫程式時要以「可讀性」為先,括號並不會扣分,反而能減少錯誤。
三個運算符的意義
/:實數除法(結果通常是 float),例如5 / 2= 2.5//:整除(只取整數部分),例如5 // 2= 2%:餘數,例如5 % 2= 1
重要關係式(理解用)
對整數而言:a = (a // b) * b + (a % b)
典型應用
- 判斷奇偶:
n % 2 == 0 - 取最後一位數:
n % 10 - 將分鐘轉換為「小時+分鐘」:
h = m // 60,r = m % 60
乘冪運算
**表示乘冪,例如2 ** 3= 8。- 平方:
x ** 2;立方:x ** 3。
例:套用公式(以圓面積為例)
為何要用複合指定?
複合指定能把「更新變量」寫得更簡潔,特別適合在循環中做累加、計數。
常見情境
- 累加總和(total)
- 計數器(count)
- 逐步更新數值(例如每次加 17)
關鍵差異
- 數值的
+是相加;字串的+是拼接。 - 字串可用
*重複,例如"*" * 5會得到*****。
若希望把數值與文字連在一起輸出,建議用 print() 的逗號分隔,或使用 f-string。
4.2 輸出 print() 與輸入 input()
print() 輸出
print("Hello"):輸出字串,要配合引號。print(x):輸出變量的值,請不要加上引號。- 同一行可以輸出多個項目:
print("Hi", name, "your mark is", mark) print()之後會自動換行,可利用end=""更改行尾設定。
input() 輸入
input()會暫停程式,等待用戶輸入,再回傳一個 字串 str。- 常見寫法:先顯示提示,再讀入,進行轉型後才計算。
- 使用
input()讀入name以及三個分數。 - 將分數轉為
float。 - 計算平均值
avg = (a + b + c) / 3。 - 利用一行
print()顯示,例如:「Sam, your average is 78.3」。
顯示參考答案
print() 的輸出規則
print(x):輸出變量內容(不要加引號)。print("x"):輸出文字 x(加引號代表字串)。print(a, b, c):同一行輸出多個項目,預設以空格分隔。
控制分隔符與行尾
sep:控制項目之間的分隔文字。end:控制行尾(預設是換行)。
標準寫法
若你需要做數學運算,應把輸入立即轉型為 int 或 float。
為何要「立即轉型」?
- 避免後面忘記轉型而導致錯誤。
- 變量型別更一致,易於維護與除錯。
兩種常用方法
- 方法一:
round(x, n)先四捨五入,再輸出。 - 方法二(較常用):f-string 格式化輸出,例如控制小數位:
{avg:.1f}。
若課程尚未教 f-string,可先掌握 round();但 f-string 是非常實用的輸出技巧。
建議解題流程
- 找出輸入:需要問用戶甚麼資料?(例如姓名、分數、半徑)
- 找出處理:公式或邏輯是甚麼?(例如平均數、面積)
- 找出輸出:要顯示甚麼?格式如何?
典型錯誤
- TypeError:通常是「字串與數值混合運算」造成,先檢查 input 有沒有轉型。
- ValueError:轉型失敗,輸入內容不是合法數字(例如輸入了英文字)。
- 輸出不符合題意:通常是 print 的格式或換行位置不正確,可用
sep、end或 f-string 改善。
最快自救方法
在出錯附近加入:
先確認「值」與「型別」是否符合預期。
4.2 函數:內置、數學庫、隨機庫(+其他常用)
學 Python 解題,好多時唔係「自己手寫晒所有公式」,而係識得用現成的函數(function)同 標準庫(library / module)加速。
✅ 下面用 Tab 分類:內置 Built‑in/math/random/其他常用(字串/列表/檔案)。
每個 Tab 都有一套 Flashcards(有更詳細例子 + 常見陷阱)。
(速查表)常用內置函數一覽
| 函數 | 用途(1 句講清) | 小例子 |
|---|---|---|
print(*items) |
輸出結果(可一次過印多個值) | print("Hi", name) |
input(prompt) |
讀取輸入(回傳字串) | age = int(input("Age: ")) |
int(x) / float(x) |
把 x 轉成整數/小數(常配合 input) | mark = float("70.5") |
str(x) |
把 x 轉成字串(方便串字) | msg = "Score=" + str(score) |
type(x) |
檢查型別(debug 常用) | print(type(x)) |
abs(x) |
絕對值 | abs(-12.5) |
round(x, n) |
四捨五入到 n 位小數 | round(10/3, 2) |
len(s) |
長度(字串/列表都可用) | len("python") |
range(a, b, step) |
產生整數序列(for 循環必用) | for i in range(1, 6): |
min() / max() |
找最小/最大(可用於列表/多個值) | max([3, 10, -2]) |
sum() |
求和(數列、列表) | sum([1, 2, 3]) |
sorted() |
排序(回傳新列表,不改原本) | sorted(nums) |
enumerate() |
for 循環同時拎 index + 值 | for i, v in enumerate(a): |
zip() |
把多個序列「一對一」綁埋一齊 | for x, y in zip(a, b): |
👇 點擊以下「示例卡片」會即時顯示示例程式同預期輸出。
(速查表)math 常用函數一覽
| 函數 / 常數 | 用途 | 備註 |
|---|---|---|
math.sqrt(x) |
平方根 | 回傳 float,例如 4.0 |
math.pi / math.e |
常數 π、e | π ≈ 3.14159…;e ≈ 2.71828… |
math.sin(x) / cos / tan |
三角函數 | x 用弧度 |
math.radians(deg) / degrees(rad) |
度 ↔ 弧度 | 考試陷阱位:單位唔啱就全錯 |
math.floor(x) / ceil(x) |
向下取整 / 向上取整 | 唔係四捨五入 |
math.log(x) / log10(x) |
對數 | log(x) 係 ln(x) |
math.exp(x) |
e^x | 常見配搭:log / exp |
math.factorial(n) |
n!(階乘) | n 必須係非負整數 |
math.gcd(a, b) / lcm(a, b) |
最大公因數 / 最小公倍數 | 整數題好常用 |
👇 點擊以下「示例卡片」會即時顯示示例程式同預期輸出。
(速查表)random 常用函數一覽
| 函數 | 回傳 / 行為 | 備註 |
|---|---|---|
random.random() |
0 ≤ x < 1 的隨機小數 | 最常用「基本隨機」 |
random.uniform(a, b) |
a ≤ x < b 的隨機小數 | 連續型隨機值 |
random.randint(a, b) |
a ≤ x ≤ b 的隨機整數 | 兩端都包括(常見陷阱) |
random.randrange(a, b, step) |
a 到 b(唔包括 b)按 step 抽整數 | 似 range() 但會抽一個 |
random.choice(seq) |
由序列隨機抽 1 個元素 | 用於抽卡/抽題 |
random.shuffle(list) |
把列表原地打亂 | 會改原本 list(in-place) |
random.sample(seq, k) |
抽 k 個不重覆元素(回傳列表) | 抽彩票、抽名單 |
random.seed(n) |
設定種子(令結果可重現) | Debug / 出題固定答案有用 |
👇 點擊以下「示例卡片」會即時顯示示例程式同預期輸出。
(速查表)字串 / 列表 / 字典 常用方法
| 類型 | 常用方法 | 一句用途 |
|---|---|---|
str |
lower() / upper() / strip() |
大小寫、去空格(清理輸入) |
str |
replace() / find() / startswith() |
替換、搜尋、檢查前綴 |
str |
split() / join() |
拆字串/用分隔符組合字串 |
list |
append() / extend() / pop() |
加元素、加多個、彈出/刪除 |
list |
sort() / reverse() |
原地排序/反轉 |
dict |
get() / keys() / items() |
安全取值/取 key/取 (k,v) |
set |
add() / discard() |
加元素/刪元素(唔存在都唔報錯) |
open()(內置) |
read() / write() / with |
檔案讀寫(加分位) |
👇 點擊以下「示例卡片」會即時顯示示例程式同預期輸出。
👇 點擊上面任何一張「示例卡片」,下方會顯示示例程式與預期輸出/解釋:
如欲實際執行程式碼,建議複製到 Thonny / IDLE;或用下方的 Python playground 即時試。
可在下方輸入任何使用 abs()、round()、math、
random 等函數的程式,然後按「Run 程式」查看輸出結果。
可以隨意修改上方程式,再次按「Run 程式」觀察結果。
請根據程式模板,在 ??? 位置填上正確的函數呼叫,並使用:
abs()、round()、type()、
math.sqrt()、math.exp()、math.sin()、
random.random() 和 random.randint()。
請保留每一行 print() 裏面的文字不變,只需要修改 ??? 部份。
當程式完成後,按「核對答案」,系統會檢查你有沒有輸出所有指定行。
期望畫面示例(數值大約如下,實際輸出可略有差異):
abs(x) = 3.678
round(x, 2) = -3.68
type(x) = <class 'float'>(或類似表示)
sqrt(16) = 4.0、exp(1) ≈ 2.718...、sin(pi/2) ≈ 1.0
最後兩行會顯示一個 0 至 1 之間的隨機小數,以及 1 至 6 之間的隨機整數。
函數的本質
函數係一段「已封裝好」嘅程式:你畀佢輸入(參數),佢幫你做計算/處理,再回傳結果。 用函數可以令程式更短、更清晰、更易重用。
呼叫函數的格式
函數名(參數1, 參數2, ...)- 回傳值通常會:存入變量/直接 print 出嚟
兩樣嘢好易混淆
print():只係「顯示」,主要方便你睇結果。- 回傳值(return value):係函數「交返畀程式」用嚟再計算嘅值。
考試寫程式時:要再做計算 → 你需要「回傳值」,唔係單靠 print。
三種最常見錯誤
- NameError:用咗未定義嘅名(變量/函數名打錯)。
- TypeError:型別唔啱(例如字串 + 數字)。
- ValueError:值唔啱(例如
int("abc"))。
見到錯先唔好慌:先睇「錯誤類型」,再睇「行號」。
三個查法
help(函數名):睇參數、解釋、例子。dir(物件或模組):睇有咩功能。- 官方文件(Python docs):最完整。
DSE 唔會考你背晒所有函數,但會考你識唔識「搵得到、用得啱」。
print 的常用參數
sep:多個 item 之間用乜分隔(預設係空格)。end:行尾加乜(預設係換行)。
最常見陷阱
input() 讀入嘅永遠係 str。
如果你要做加減乘除,要先用 int() / float() 轉型。
轉型要小心輸入
int("12")OK;int("12.5")會錯。float("12.5")OK;float("abc")會錯。
正式程式可以用 try/except,但 DSE 初階題多數假設輸入格式正確。
用 type 查真身
當你覺得計算結果怪怪地,第一步:print(type(x))。
len 用法
len("python")→ 6len([10,20,30])→ 3
range 的三種寫法
range(n):0 到 n-1range(a, b):a 到 b-1range(a, b, step):加 step
DSE 最常見錯:以為 range(1,6) 會去到 6(其實去到 5)。
兩個常用數值處理
abs(x):絕對值round(x, n):四捨五入到 n 位小數(n 可省略)
考試通常唔會卡你 2.5 呢種邊界位;但知道 round 可能唔係「傳統」四捨五入。
最值 + 求和
亦可以直接比多個參數
sorted vs sort
sorted(a):回傳新列表;不改原本 a。a.sort():原地排序;會改原本 a;回傳None。
enumerate:同時拎 index + 值
zip:兩個列表一齊行
DSE 常用:同時掃兩個列表(例如:學生名 + 分數)。
模組(module)與命名空間
import math係「載入 math 模組」。math.sqrt(16)代表:使用 math 模組內的 sqrt。- 好處:唔怕同其他模組同名。
常見寫法
x ** 0.5:開平方(最常見)math.sqrt(x):開平方(語意清晰)pow(a, b):內置函數;同a ** b類似
math 常數
最常見陷阱:單位
Python 的三角函數用弧度(rad),唔係度數(degree)。
度數 → 弧度
向下 / 向上取整
要四捨五入用 round(),唔好用 floor/ceil。
對數與指數
math.log(x):ln(x)math.log10(x):log10(x)math.exp(x):e^x
階乘
如果 n 係小數或負數會報錯;DSE 題通常會保證 n 合法。
最大公因數 / 最小公倍數
點解 0.1 + 0.2 ≠ 0.3?
浮點數有誤差,直接用 == 可能失敗。
DSE 初階題通常唔會卡你呢點,但寫得穩陣會更好。
random 做咩?
random 模組用嚟產生隨機數,常用於模擬(擲骰、抽卡、抽樣)。
你每次 run,數值都應該唔同(除非你 set 咗 seed)。
random.seed(n)
設定同一個 seed,會令隨機序列可重現(每次都一樣)。
上面兩段輸出會一樣,因為 seed 一樣。
兩種常用小數
random.random():0 ≤ x < 1random.uniform(a, b):a ≤ x < b
端點有分別
randint(a, b):包括 a 同 brandrange(a, b):包括 a,但唔包括 b(同 range 一樣)
抽一個
抽 k 個(不重覆)
sample 係「不重覆」,所以 k 唔可以大過元素數量。
會改原本 list
如果你想保留原本次序,先 copy:cards2 = cards[:]。
簡單模擬
呢類題常見:for loop + random + if。
random 係一般用途
random 係一般模擬/遊戲用途,唔係用嚟做密碼安全。
真正安全用途(密碼/Token)應該用 secrets(加分知道即可)。
Function vs Method
- 函數:
len(s)(直接呼叫) - 方法:
s.split()(物件自己帶住嘅功能)
方法一定係「物件.方法()」。
處理用戶輸入最常用
常見用法:ans = input().strip().lower() 方便比較答案。
三個常用
拆(split)
組(join)
三種加入方法
append(x):加 1 個元素去尾extend(list2):加多個元素去尾insert(i, x):插入去指定位置
兩種刪除
pop():彈出最後一個(或 pop(i) 彈出指定位置),會回傳被刪嘅值。remove(x):刪第一個等於 x 嘅元素(冇就會報錯)。
要記住:sort 會改原本 list
安全取值:get
掃 key/value
set 最常用途:去重
add / discard
最安全寫法:with
with 會自動幫你關檔,避免漏 close。
注意:網頁版 Python(Skulpt)對檔案 IO 可能有限制;但真 Python 可以。
4.3 選擇結構:if / elif / else
關係運算符(用於比較)
==等於,例如mark == 50!=不等於>、>=大於(或大於等於)<、<=小於(或小於等於)
⚠️ 請留意 =(指定)與 ==(比較)意義完全不同!
if / else 基本結構
當 mark >= 50 成立(True)時,會執行 if 部分;否則便執行 else 部分。
if / elif / else 多向選擇
Python 會由上而下檢查各個條件,遇到第一個為 True 的條件就會執行相應部分,之後離開整個 if 結構。
請指出錯誤位置,再寫出正確版本,並可以用下方小型 Python 編譯器測試自己的答案。
顯示參考答案
請撰寫一個程式,輸入 mark(0–100):
- ≥ 80 → 輸出
"Excellent" - 60–79 → 輸出
"Good" - 40–59 → 輸出
"Pass" - < 40 → 輸出
"Fail"
顯示參考答案
語法必須正確
if 條件:行尾一定要有冒號:- if/elif/else 下面的程式碼必須縮排一致(通常 4 個空格)。
- 縮排代表「哪些語句屬於同一個程式區塊」。
縮排錯誤是初學者最常見的語法錯誤之一;看到 IndentationError 時,首先檢查空格對齊。
條件會計算為 True 或 False
- 關係運算符:
==、!=、>、>=、<、<= - 條件可以是單一比較,也可以由多個比較以 and/or/not 組合。
特別提醒:= 與 ==
=:指定(把值交給變量)==:比較(判斷是否相等)
多向選擇的流程
- Python 會由上至下檢查各個條件。
- 一旦遇到第一個為 True 的條件,就執行該區塊並離開整個 if 結構。
為何次序很重要?
若把「範圍較大」的條件放在上面,後面條件就可能永遠不會被執行。
兩種寫法
- elif:適合「同一條主線」的多段範圍,例如分級。
- 巢狀 if:適合「先做第一層判斷,再在其中細分」的情況。
選擇能令條件「一眼看懂」的寫法,通常就是較好的寫法。
自查清單
- 每個
if/elif/else行尾是否有:? - 同一層次的程式區塊縮排是否一致?
- 比較是否誤用
=代替==? - 條件是否覆蓋所有情況?(是否需要 else 作「其他」處理?)
- 輸入型別是否正確?(例如 mark 是否已轉為 int/float?)
若程式可執行但結果不合理,通常屬於邏輯錯誤:請重新檢查條件範圍與判斷次序。
4.3 布爾運算:AND / OR / NOT
有時需要同時考慮多個條件,可以用布爾運算符將兩個或以上的條件結合起來。
A and B:A 和 B 都為 True,整體才為 True。A or B:A 或 B 其中一個為 True,整體便為 True。not A:將 A 反轉,True 變為 False,False 變為 True。
在下方撰寫一些布爾表達式,例如 3 > 1 and 5 < 10、
not True,或配合 if 一起使用,然後透過 Python 編譯器查看結果。
假設:age = 10、is_senior = False。
(age < 12) or is_senior(age >= 18) and (age <= 65)not is_senior
請按「下一題」顯示題目,然後選擇 True 或 False。系統會即時批改並累積得分。
基本定義
- 布爾值只有兩個:
True與False。 - 布爾表達式是「計算後會得到 True/False」的式子,例如
mark >= 50。
布爾表達式的來源
- 關係運算(比較):
>、<=、==… - 邏輯運算(組合條件):
and、or、not
三個規則
A and B:A 與 B 都為 True,結果才是 True。A or B:A 或 B 其中之一為 True,結果就是 True。not A:把 A 反轉(True ↔ False)。
優先次序(常用)
not的優先次序最高- 其次是
and - 最後是
or
建議做法
在教學與考試中,遇到多個條件時,使用括號能大幅降低誤判風險。
三種常見模式
- 範圍:例如 18–65 歲:
(age >= 18) and (age <= 65) - 例外:例如「不是學生」:
not is_student - 雙重要求:例如「同時滿足兩項」:使用
and
Python 特色:連鎖比較(更易讀)
常見錯誤
- 把
and/or寫成其他語言符號(例如&&、||)— Python 不接受。 - 條件未加括號導致誤判(尤其同時出現 and 與 or)。
短路評估(了解即可)
A and B:若 A 已是 False,Python 不會再計算 B(因結果必定 False)。A or B:若 A 已是 True,Python 不會再計算 B(因結果必定 True)。
短路能提升效率,也能避免某些錯誤(例如先檢查分母不為 0 才做除法)。
4.4 重複執行:for 循環
for 循環適用於「已知需要重複多少次」的情況,例如由 1 數到 10,或重複輸出 5 次星號。
range() 基本用法
range(end):由 0 數到 end-1。range(start, end):由 start 數到 end-1。range(start, end, step):每次相隔 step。
請撰寫一個程式,輸出 7 的乘數表(由 7×1 至 7×10)。
顯示參考答案
輸入正整數 n,計算 1 + 2 + ... + n。
顯示參考答案
何時選用 for?
- 當你已知道要重複多少次(例如重複 10 次)。
- 當你要遍歷一個明確範圍(例如 1–100)。
基本結構
以上程式會令 i 依次成為 1、2、3、4、5,並逐行輸出。
range 的規則
range(end):0 到 end-1range(start, end):start 到 end-1range(start, end, step):每次加 step(可為負數)
最常見錯誤是「以為 range(1, 6) 會包含 6」,但其實不包含。
模式 1:計數(count)
模式 2:累加(sum / total)
模式 3:尋找(max/min)
判斷方法
- 若題目說「由 1 到 n(包含 n)」,通常要寫
range(1, n + 1)。 - 若題目說「重複 n 次」,常用
range(n)。
巢狀循環用途
- 製作乘法表、矩形圖案(星號)等二維輸出。
- 處理「兩層」重複,例如每班(外層)內每位學生(內層)。
4.4 while 循環
while 循環會先檢查條件,條件成立時重複執行循環本體;條件不成立時便跳出循環。
⚠️ 請務必在循環中更新與條件相關的變量,否則可能會變成無限循環。
例子:要求用戶輸入正數
設定正確密碼為 "ict123",使用 while 反覆要求用戶輸入,直至輸入正確才結束。
顯示參考答案
何時選用 while?
- 當你無法預先知道要重複多少次(例如直到輸入正確密碼)。
- 當停止條件由用戶輸入或運算結果決定(例如直到數值達到某個界線)。
基本結構
while 是「先判斷、後執行」的循環:條件一開始就為 False,循環一次也不會執行。
無限循環的成因
如果循環內沒有改變與條件相關的變量,條件可能永遠保持 True,程式便會不停重複。
例:正確的「逐步逼近」寫法
重點:num = num + 17 令 num 逐步增加,最終使條件不成立而退出。
為何輸入驗證常用 while?
因為用戶可能輸入錯誤多次,你無法預先知道需要重試多少次。
這是「哨兵式(sentinel)」思維:只要輸入不合規格,就持續要求重新輸入。
簡明判斷
- 次數已知(或可用 range 明確表示)→ 優先用
for - 次數未知(由條件決定何時停)→ 優先用
while
同一題目兩種寫法(理解差異)
break 的概念
break 可立即離開循環,常用於「找到答案即可停止」或「遇到特殊情況立即退出」。
初學階段可先用「條件式 while」完成;理解 break 後再用於簡化結構。
綜合 Debug 練習:閱讀錯誤訊息與修改程式碼
編寫程式時一定會遇到錯誤,重要的是學會閱讀錯誤訊息,並逐步檢查和修正。
三大錯誤類型
- 語法錯誤(syntax error):例如關鍵字拼錯、括號不配對、漏掉冒號等。
- 執行時錯誤(runtime error):例如除以 0、轉型失敗等。
- 邏輯錯誤(logic error):程式可以執行,但計算結果不正確。
請先在小型 Python 編譯器試行這段程式,觀察出現的錯誤訊息,再自行修改程式碼,令它正確輸出
Hello World!。
顯示參考答案
問題在於漏掉右括號:
程式本來想計算 1 + 2 + ... + 10,理應輸出 55,但現在會輸出錯誤答案。
請在下方修改程式,然後以「核對答案」自動檢查輸出是否正確。
顯示參考答案
- 原因:加總的是
2 * i,實際在計算2(1+2+...+10)。 - 改寫方法:循環內應改為
total = total + i。
1) 語法錯誤(Syntax Error)
- 程式無法開始執行。
- 常見原因:漏括號、漏冒號、關鍵字拼錯、縮排錯誤。
2) 執行時錯誤(Runtime Error)
- 程式能開始執行,但在某一步中途崩潰。
- 常見原因:除以 0、轉型失敗(ValueError)、型別不相容(TypeError)。
3) 邏輯錯誤(Logic Error)
- 程式可順利執行,但輸出結果不正確。
- 常見原因:公式寫錯、條件範圍錯、循環次數 off-by-one。
Traceback 提供甚麼資訊?
- 錯誤類型(例如
TypeError、ValueError)。 - 出錯位置(檔案與行號)。
- 錯誤原因的提示文字。
建議閱讀次序
- 先看最後一行:通常最直接指出錯誤類型與訊息。
- 再看行號:回到該行檢查變量值與型別。
- 若錯誤由函數呼叫引起,向上看呼叫鏈(但初學者通常先修正最底層提示即可)。
一套可重複使用的方法
- 重現問題:用相同輸入再跑一次,確定錯誤可重現。
- 縮小範圍:找出「最有可能出錯」的幾行(通常在 traceback 指向的位置)。
- 印出關鍵變量:用
print(x, type(x))檢查資料。 - 驗證假設:逐個排除可能原因(型別?值?條件?範圍?)。
- 修正後再測試:用多組輸入測試(正常值、邊界值、特殊值)。
這個流程能處理大部分初學者遇到的錯誤,尤其是「程式能跑但答案不對」的情況。
常用功能
- Step over / Step into:逐行執行,觀察每一步的變化。
- Variables 視窗:即時查看變量的值與型別。
- Breakpoints:在特定行停下,方便檢查某一步的狀態。
甚麼時候要用除錯器?
- 當你無法想像循環內變量如何變化時(特別是 while / 多層 if)。
- 當你懷疑某一行計算結果不如預期時。
快速對照
- IndentationError:檢查縮排是否一致(空格/Tab 混用、對齊錯)。
- NameError:變量未定義或拼錯名字。
- TypeError:型別不相容,先檢查 input 是否轉型、是否把字串當數值運算。
- ValueError:轉型失敗,輸入格式不符(例如
int("12.3"))。 - ZeroDivisionError:分母為 0,先檢查輸入或加入條件防護。
建議:遇到錯誤先不要急於改動多處;每次只改一個假設,容易判斷真正原因。
挑戰 20 條偽代碼 → Python 練習
每一題都包含:偽代碼、留白區讓學生自行撰寫 Python,以及可選擇顯示的參考答案。 建議學生:先嘗試以自己的方法完成,再打開答案對照。
偽代碼使用「輸入」「輸出」「←」等字眼,語法不需要完全與 Python 一致。