本文 AI 產出,尚未審核
Python 基本語法:縮排與程式區塊(4 空格規則)
簡介
在 Python 中,縮排不只是排版美觀的需求,它直接決定程式的執行邏輯。與許多使用大括號 {} 或 end 來劃分程式區塊的語言不同,Python 完全依賴一致的縮排來辨識哪一段程式碼屬於同一個區塊。
掌握正確的縮排規則,能避免 IndentationError、提升程式可讀性,同時讓團隊協作更順暢。對於剛踏入 Python 的新手以及希望寫出乾淨、可維護程式碼的中級開發者來說,熟悉「4 空格」的慣例是必備功課。
核心概念
1. 為什麼選擇 4 空格?
Python 官方文件(PEP 8)建議使用 4 個空格 作為一層縮排的標準。原因包括:
- 可讀性:4 個空格在視覺上提供足夠的層次感,又不會過於寬闊。
- 一致性:跨專案、跨團隊使用相同縮排寬度,可減少合併衝突。
- 兼容性:大多數編輯器與 IDE 預設即支援 4 空格縮排。
注意:切勿混用 Tab 與 空格,除非所有開發者都統一使用 Tab(不建議)。
2. 縮排的基本規則
| 情況 | 必須縮排的程式碼 | 縮排層級 |
|---|---|---|
if、elif、else |
條件成立時執行的語句 | +1 |
for、while |
迴圈內的每一次執行語句 | +1 |
def、class |
函式或類別的內容 | +1 |
try、except、finally |
例外處理區塊 | +1 |
with |
上下文管理區塊 | +1 |
範例:下面的程式碼示範了
if、for、def三種常見區塊的縮排。
def greet(name):
"""傳回問候字串"""
if name: # 條件判斷開始
for i in range(3): # 迴圈開始
print(f"Hello, {name}!") # 內層語句,縮排 2 層
else:
print("Hello, world!") # else 區塊,同樣縮排 1 層
3. 多行敘述的縮排
當一行程式過長需要斷行時,可使用 反斜線 \ 或圓括號、方括號、大括號自動換行。此時,後續行必須再額外縮排 4 個空格(或更深),以示屬於同一個語句。
# 使用反斜線
total = (price * quantity) \
- discount + tax
# 使用圓括號(較推薦)
total = (
price * quantity
- discount
+ tax
)
4. 空行與縮排的關係
PEP 8 建議在 不同程式區塊之間留一個空行,但空行本身不影響縮排層級。若在同一區塊內插入空行,仍需保持前後行的縮排一致。
def compute():
result = 0
# 空行不會改變縮排層級
for i in range(10):
result += i
return result
5. 常見的錯誤訊息
| 錯誤訊息 | 可能原因 | 解決方式 |
|---|---|---|
IndentationError: unexpected indent |
多餘的縮排或混用 Tab/空格 | 確認所有行使用相同的縮排字元(建議 4 空格) |
IndentationError: expected an indented block |
缺少必要的縮排(如 if 後未縮排) |
為控制結構添加正確的縮排層級 |
TabError: inconsistent use of tabs and spaces in indentation |
同一檔案內同時使用 Tab 與空格 | 使用編輯器的「Convert Tabs to Spaces」功能統一為空格 |
常見陷阱與最佳實踐
混用 Tab 與空格
- 陷阱:不同開發環境的 Tab 寬度設定不同,會導致程式在別人機器上跑出錯。
- 最佳實踐:在 IDE/編輯器中設定 「把 Tab 轉成 4 個空格」,並在
.editorconfig或pyproject.toml中明確規範。
縮排層級過深
- 陷阱:過多巢狀會讓程式難以閱讀。
- 最佳實踐:使用 早期返回(early return)、函式抽離 或 策略模式,降低巢狀深度。
忘記在多行敘述後續行縮排
- 陷阱:在長列表、字典或函式呼叫斷行時,後續行與前一行對齊,Python 仍會視為新語句。
- 最佳實踐:在斷行後額外縮排 4 個空格,或使用圓括號自動換行。
在同一區塊內插入不必要的空行
- 陷阱:過多空行會使程式看起來斷斷續續。
- 最佳實踐:遵循 PEP 8 建議:函式內部最多留兩個連續空行,函式與函式之間留一個空行。
實際應用場景
| 場景 | 為何縮排重要 | 範例說明 |
|---|---|---|
| Web 框架(如 Flask)路由定義 | 路由函式內的程式碼必須正確縮排,否則會產生 500 錯誤。 | python\n@app.route('/')\ndef index():\n return "Hello, World!"\n |
| 資料分析 Pandas 操作 | 多層條件過濾常使用 if、for,錯誤縮排會導致資料錯亂或程式中斷。 |
python\nfor col in df.columns:\n if df[col].dtype == 'object':\n df[col] = df[col].str.strip()\n |
| 自動化測試 (pytest) | 測試函式須以 def test_... 開頭,內部斷言語句必須縮排。 |
python\ndef test_sum():\n assert sum([1, 2, 3]) == 6\n |
| 機器學習模型訓練 | 訓練迴圈與參數設定往往巢狀多層,保持一致縮排可快速定位錯誤。 | python\nfor epoch in range(10):\n for batch in loader:\n loss = model(batch)\n loss.backward()\n optimizer.step()\n |
總結
- 縮排是 Python 語法的核心,4 空格已成為事實上的標準。
- 只要遵守「統一使用空格、每層 4 個、避免混雜 Tab」的原則,就能大幅降低
IndentationError與可讀性問題。 - 在實務開發中,設定 IDE、使用 lint 工具(如 flake8、black),讓縮排自動化、標準化,是提升團隊效率的關鍵。
掌握了正確的縮排與程式區塊概念,你就能寫出結構清晰、易於維護的 Python 程式,無論是寫腳本、建置 Web 服務,或是開發機器學習模型,都能事半功倍。祝你在 Python 的道路上越寫越順!