1. 程式人生 > 其它 >零基礎學程式設計031:Python與其它語言最不同的一條語法規則

零基礎學程式設計031:Python與其它語言最不同的一條語法規則

有C或JAVA其它程式語言基礎的人可能對Python中的這條語法規則最不適應:Python中的縮排是有語法含義的,它用來表示一個程式碼塊(code block)。這裡說的程式碼塊是指函式定義條件語句迴圈語句等等。縮排就是指每行程式碼最前面的幾個空格或TAB製表符,通常是與上一行的冒號一起使用的,例如:

# 為了清楚地表示縮排,我把空格都用.表示
def price(stock) :
....url = 'http://hq.sinajs.cn/list=' + stock
....with req.urlopen(url) as f :
........hq = f.read().decode('GBK')
........v = hq.split(',')
........return v[1]

假設用C#語言來寫,大概是這樣:

// 這段程式碼只是一個示例,無法通過編譯
double price(string stock) {
    string url = 'http://hq.sinajs.cn/list=' + stock;
    using(WebRequest f = new WebRequest(url)) {
        string hq = f.read().decode('GBK');
        string []v = hq.split(',');
        return v[1];
    }
}

大部分程式語言都是通過花括號"{"、"}"這類符號來標記塊的開始和結束,花括號內部的程式碼並不需要縮排,縮排只是為了讓程式設計師更容易讀,更容易看懂程式碼的邏輯結構。在C#裡,剛才的程式碼也可以這樣寫:

// 這段程式碼只是一個示例,沒有縮排的程式碼難以閱讀
double price(string stock) {
string url = 'http://hq.sinajs.cn/list=' + stock;
using(WebRequest f = new WebRequest(url)) {
string hq = f.read().decode('GBK'); 
string []v = hq.split(','); return v[1];
}  }

Indent縮排、Deindent反縮排

而Python把這些花括號也給省了,縮排是一條強制性的語法規則,如果縮排不正確,則程式碼會報錯!

來看看《18零基礎學程式設計018:條件語句》中的那段程式碼,如果寫成這樣:

from turtle import * 
for i in range(365) : 
    forward(1.01 ** i)
    left(9)
    if(i%7==0) : 
    stamp()

則會提示:

There is an error (expected an indented block) at line 6, column 9.

indent就是向右縮排的意思,而deindent(或dedent)是向左縮排的意思,向左縮排是我編的名字,我也不知道deindent的正規中文翻譯是什麼。

在IDLE整合環境中,還有專門的快捷鍵ctrl + ] 用於縮排,而ctrl + [ 則是相反的操作。

不要使用製表符TAB?

按TAB鍵也可以產生縮排的效果,這一點在Word排版時也會用到,但在Python中要小心了,不同的文字編輯器對TAB的解釋可能不一致,有些預設是8個字元,有些是4個字元,有些則是對齊到8的倍數列上,如果你的程式碼中混用TAB和空格,則會出現一些奇怪的錯誤。

現在的許多編輯器中都增加了一項設定,可以自動將TAB儲存為多個空格,比如IDLE、Notepad++(注意不是Windows中自帶的記事本,多個兩個加號,功能強大多了),當你按TAB鍵時,自動產生的是4個空格。

在這種編輯器中寫程式碼就方便多了,你按一次TAB可以,按四次空格也行,效果一樣。像Notepad++中還提供了細細的對齊線等功能,還可以突出顯示空格和製表符,讓你看得更清楚。

Python編碼規範

Python語言本身對於縮排的空格數沒有規定,但為了讓程式設計師們互相之間容易溝通,Python社群對程式碼的規範性提出了許多建議,如果你遵守這些建議,則與全世界的程式設計師們基本上保持了一致的習慣。網址:https://www.python.org/dev/peps/pep-0008/

關於縮排這一部分,規範中規定:

  • 縮排用4個空格
  • 一條比較長的語句也可以用縮排分成多行,詳細的規定請閱讀英文原文
  • Python 3中已經禁止TAB和空格混用

懸掛else問題

在其它程式語言中,有可能會遇到這類的懸掛else問題,即末尾的else語句與2個if語句中哪一個配對?有經驗的程式設計師會要求所有的語句都要有花括號。

在Python中的這樣一段程式碼:

if (條件1) :
    if (條件2) :
        fun1();
else :
    fun2();

在C#或JAVA中會寫成這樣:

if (條件1) {
    if (條件2) {
        fun1();
    }
}
else {
    fun2();
}

Python的縮排規則讓程式碼顯得更簡潔,根本不會出現懸掛else的問題,你的縮排表明了你的else與哪個if相匹配。

當然Python中的縮排也有一個缺點,如果你從網頁上覆制python程式碼,有些網頁上的程式碼排版本來就很亂,如果原始的python程式碼縮排亂了,則無法重新格式化。

小結:

  • 選用支援將TAB自動轉換為4個空格的編輯器或整合開發環境
  • 保持TAB為4個空格的預設編輯器設定
  • 從其它地方貼上的程式碼如果出現錯誤,可以用對齊線輔助檢查
  • 遵守Python的編碼規範,方便與全世界的其他程式設計師溝通

--- END ---