python – 關於縮排 indent 兩三事
python 程式語言,並沒有使用 { } 來表示區塊 block 的觀念,主要都是透過縮排來表示,這一點讓剛學 python 的我相當不習慣。
舉例來說:
1. 這樣簡單的程式碼,你覺得畫面上會列印出什麼呢?
答案:
2. 如果程式碼改為這樣,結果又是如何?
答案:
3. 最後程式碼改為這樣,又會怎樣?
答案:竟然連 PyScripter 編輯器就直接回報錯誤,你猜對了嗎?
4. 現在你應該知道 python 對於「縮排」是非常嚴謹的!主要幾個規則把握好,就可以:
不管你是使用 if、elif、else、for、while 等會使用到區塊概念的關鍵字,當在「:」之後的下一行的就必須縮排
(1) 「:」之後的下一行必須縮排,除非程式碼緊接在「:」之後的同一行且只有一行
(2) 當縮排的空白數決定後,同一個縮排等級的程式碼就必須使用相同的空白數進行縮排。 例如:在 3. 的例子,第 8 行使用 4 個空白進行縮排,而同一等級的第 10 行只有 2 個空白就不一致
(3) 不同縮排等級 (indentation level),可以使用不同的空白數 (但是這樣排版看起來很沒有一致性)
(4) 要回到上一層縮排等級,則去除目前縮排等級的空白數即可。
(5) Tab (通常 4 個空白寬度) 與 4 個空白是不一樣的 ( IDE 可能會自動幫忙修正 )
其實,只要把握一個原則:同一個縮排等級,要靠左對齊就是了。
5. 關於 (3) 的問題,其實 python 有好用的工具 Reindent 來幫忙,調整程式碼所有的 indentation。
例如下圖的程式碼符合縮排原則,但是卻沒有一致性:
PyScripter 安裝時,就內建 Reindent 工具,我們就可以透過 Tools –> Tools –> Reindent 就進行調整:
排好結果如下:
補充一點,Reindent 並不是自動排版 auto format 工具,只是針對縮排等級進行一致性的調整。
如果程式碼的縮排等級有錯,IDE 都已經報錯的情況下,Reindent 是無能為力的。
6. 關於 (4) Tab 與空白是不同的,可以直接在 python command line 進行測試:
如果缺乏一致性,即使看起來縮排等級一致,python interpreter 還是會錯誤的。
而 PyScripter 是相當貼心的 IDE,裡面有自動轉換的設定。
首先,我們可以先把「顯示特殊字元」的設定打開,好讓我們進行觀察 Tab 與空白:
透過 Tools –> Options –> Editor Options… 進入
到「Options」-> 將「Show special chars」打勾即可:
設定好之後,特殊字元包含換行、空白、Tab 等都會顯示出來:
7. 剛剛有提到,有些 python 編輯器會自動將 Tab 轉為空白,而 PyScripter 預設值正是如此。
如果你要關閉的話,一樣在 Editor Options 中,將「Tabs to spaces」勾勾取消即可:
重新對程式碼進行編輯,就會發現 Tab 與空白的不同 (觀察第 6 行與第 7 行):
取消「Tabs to spaces」後,IDE 馬上就會知道縮排錯誤囉…
8. 常見的縮排錯誤:
(1) first line indented :第一行就縮排
(2) not indented :沒有縮排 (該縮排卻未縮排)
(3) unexpected indent :未預期的縮排 (還沒有開始下一個縮排等級,就增加縮排)
(4) inconsistent dent:不一致的凸排 (回到上一個縮排等級,卻沒有對齊其他同等級縮排行)
參考: