python 中用什麼鍵縮排 —— tab 還是空格?

ARM的程式設計師敲著詩歌的夢發表於2018-12-02

python 中用什麼鍵縮排—— tab 還是空格?

實驗設計

實驗環境:Python 3.5.2
特別說明:我的編輯器設定tab寬度是4個空格,可是程式碼發到CSDN上就變成8個空格了,真奇怪。請各位看官見諒。

假設要縮排的塊有3行。程式碼如下

if 10>4:
    	print("hello")
    	print("hello")
    	print("hello")

其中2~4行是要縮排的塊語句。

實驗內容如下:

  1. 每一行都用1個 tab 鍵縮排,注意:編輯器中沒有設定把 tab 轉換為空格,也就是說 tab 就是 tab,它的 ASCII 值是 0x09
  2. 第一行用1個 tab,第二行用 2個 tab, 第三行用1個 tab,看看會不會報錯
  3. 用空格鍵縮排,每一行都用1個空格。空格的 ASCII 值是 0x20
  4. 第一行用1個空格,第二行用1個空格,第三行用2個空格,看看會不會報錯
  5. 混合用tab和空格:第一行用1個tab(編輯器中設定一個tab的寬度是4個空格),第二行用1個tab,第三行用4個空格,看看會不會報錯
  6. 混合用tab和空格:每一行都用4個空格 + 一個tab

實驗過程

實驗1

每一行都用1個 tab 鍵縮排,程式碼看起來是這樣的:

if 10>4:
	print("hello")
	print("hello")
	print("hello")

執行結果是:

hello
hello
hello

沒有報錯。

我們看一下程式碼的 ASCII,以確定用的確實是 tab

在這裡插入圖片描述
tab 的 ASCII 值是 0x09, 它前面的 “0D 0A”是Windows的回車。

實驗2

第一行用1個 tab,第二行用 2個 tab, 第三行用1個 tab,看看會不會報錯。程式碼看起來這樣:

if 10>4:
	print("hello")
		print("hello")
	print("hello")

執行結果報錯了,第3行有錯

  File "tab_or_space.py", line 3
    print("hello")
    ^
IndentationError: unexpected indent

看一下 ASCII 碼,確定確實用了不同個數的 tab

在這裡插入圖片描述

通過上面的2個實驗,可以得出結論:

用 tab 縮排是可以的,但是要保證每行用同樣個數的 tab 。

實驗3

用空格鍵縮排,每一行都用1個空格。程式碼看起來這樣:

if 10>4:
 print("hello")
 print("hello")
 print("hello")

看一下 ASCII 碼,確定我們用的是空格(ASCII 值是 0x20)

在這裡插入圖片描述

執行結果呢?沒有問題,和實驗1的結果一樣,這裡就不貼了。

實驗4

第一行用1個空格,第二行用1個空格,第三行用2個空格,看看會不會報錯

程式碼如下:

if 10>4:
 print("hello")
 print("hello")
  print("hello")

執行時候報錯了,第4行有錯

  File "tab_or_space.py", line 4
    print("hello")
    ^
IndentationError: unexpected indent

通過實驗3和實驗4,可以得出結論:

用空格縮排是可以的,但是要保證每行用同樣個數的空格 。

實驗5

混合用tab和空格:第一行用1個tab(編輯器中設定一個tab的寬度是4個空格),第二行用1個tab,第三行用4個空格。

首先對編輯器做一個設定,我用的是 notepad++

在這裡插入圖片描述

TAB 的寬度是4,並且沒有勾選“替換為空格”

程式碼看起來是這樣的(感覺很整齊):

if 10>4:
	print("hello")
	print("hello")
	print("hello")

看一下 ASCII 碼,就知道空格和 tab 混用了。

在這裡插入圖片描述

執行結果呢?

  File "tab_or_space.py", line 4
    print("hello")
                 ^
IndentationError: unindent does not match any outer indentation level

第4行報錯了。

我們把程式碼調整一下,第一行用1個tab,第二行用4個空格,第三行用4個空格。

ASCII 的截圖是:

在這裡插入圖片描述

執行結果是:

  File "tab_or_space.py", line 3
    print("hello")
                 ^
IndentationError: unindent does not match any outer indentation level

第三行報錯。

也就是說,空格和tab不能混用,但是下這個結論還不夠嚴謹,於是我設計了實驗6。

實驗6

混合用tab和空格:每一行都用4個空格 + 一個tab

哦,我想起來了,貼 ASCII 碼實在是麻煩,編輯器有一個顯示空格和製表符的功能。我們們顯示出來後貼個程式碼截圖圖。

在這裡插入圖片描述

執行結果呢?你猜猜。哈哈,成功執行。

hello
hello
hello

雖然可以成功執行,但這樣做就是“作”。你能記住到底用多少個空格和tab嗎?我是記不住。

實驗結論

做了這麼多實驗,終於可以得出結論了:

Python中縮排可以用空格,也可以用tab,甚至可以混用(比如每一行你先用1個tab,再用4個空格,再用2個tab,再用4個空格);

不管你怎麼縮排的,你都要保證,第二行和第一行用的字元一樣,第三行和第二行用的字元一樣,…… ,也就是每一行用的字元一樣。

最佳實踐

其實 Python 並沒有強制要求你用Tab縮排或者用空格縮排,但在 PEP8中,建議使用4個空格來縮排。
Python Enhancement Proposals index 8 —— Style Guide for Python Code
https://www.python.org/dev/peps/pep-0008/

Use 4 spaces per indentation level.

有人會問,為什麼用空格?用 tab 多方便。

我要說:不僅僅是python,對於任何程式語言來說用space替代tab都是一個好的選擇。

因為程式碼檔案可能會在不同的環境、用不同的編輯器開啟。對於space的處理,幾乎所有的編輯器、OS都是一樣的;而對於tab的處理卻不盡相同,有的會直接展開成空格,有的不會,就算展開為空格,有的是4個,有的是8個……這樣會造成程式碼的格式看起來不一致。對於python來說這個問題更加致命,因為縮排是python語法的一部分——python靠縮排表示塊結構。對於Python,就算看起來整齊,也不能保證每一行都用了一致的tab或空格,所以會惹來很多麻煩。

又有人問,每次按4個空格多麻煩,有沒有簡單點的方法?

當然有了,對於任何一個編輯器或者IDE,一般都有配置選項,可以設定把 TAB 鍵展開為4個空格。

notepad++ 應該這樣設定:

在這裡插入圖片描述

設定好後,我嘗試敲擊TAB,發現其實被換成了4個空格。

在這裡插入圖片描述

對於 VIM,可以這樣設定

set tabstop=4   "設定Tab顯示的寬度為4個空格
set expandtab   "設定將Tab自動展開成為空格

= 全文完 =


參考資料

【1】https://segmentfault.com/q/1010000000158915

【2】https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces

【3】https://www.jianshu.com/p/7d27858b8d2b

相關文章