Python – 關於縮排 indent 兩三事

  • 37989
  • 0

python – 關於縮排 indent 兩三事

python 程式語言,並沒有使用 { } 來表示區塊 block 的觀念,主要都是透過縮排來表示,這一點讓剛學 python 的我相當不習慣。

 

舉例來說:

1. 這樣簡單的程式碼,你覺得畫面上會列印出什麼呢?

image

 

答案:

image

 

2.  如果程式碼改為這樣,結果又是如何?

image

 

答案:

image

 

3. 最後程式碼改為這樣,又會怎樣?

image

 

答案:竟然連 PyScripter 編輯器就直接回報錯誤,你猜對了嗎?

image

 

 


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。

例如下圖的程式碼符合縮排原則,但是卻沒有一致性:

image

 

PyScripter  安裝時,就內建 Reindent 工具,我們就可以透過 Tools –> Tools –> Reindent 就進行調整:

image

 

排好結果如下:

image

 

補充一點,Reindent 並不是自動排版 auto format 工具,只是針對縮排等級進行一致性的調整。

如果程式碼的縮排等級有錯,IDE 都已經報錯的情況下,Reindent 是無能為力的

 

 


6. 關於 (4) Tab 與空白是不同的,可以直接在 python command line 進行測試:

image

如果缺乏一致性,即使看起來縮排等級一致,python interpreter 還是會錯誤的。

 

而 PyScripter 是相當貼心的 IDE,裡面有自動轉換的設定。

首先,我們可以先把「顯示特殊字元」的設定打開,好讓我們進行觀察 Tab 與空白:

透過 Tools –> Options –> Editor Options… 進入

image

到「Options」-> 將「Show special chars」打勾即可:

image

 

設定好之後,特殊字元包含換行、空白、Tab 等都會顯示出來:

image

 


7. 剛剛有提到,有些 python 編輯器會自動將 Tab 轉為空白,而 PyScripter 預設值正是如此。

如果你要關閉的話,一樣在 Editor Options 中,將「Tabs to spaces」勾勾取消即可:

image

 

重新對程式碼進行編輯,就會發現 Tab 與空白的不同 (觀察第 6 行與第 7 行):

image

取消「Tabs to spaces」後,IDE 馬上就會知道縮排錯誤囉…

 

 


8. 常見的縮排錯誤:

image

(1) first line indented :第一行就縮排

(2) not indented :沒有縮排 (該縮排卻未縮排)

(3) unexpected indent :未預期的縮排 (還沒有開始下一個縮排等級,就增加縮排)

(4) inconsistent dent:不一致的凸排 (回到上一個縮排等級,卻沒有對齊其他同等級縮排行)

 

參考:

Why does Python use indentation for grouping of statements?

2.1.8. Indentation

31.8. tabnanny — Detection of ambiguous indentation