零基礎學程式設計031:Python與其它語言最不同的一條語法規則
阿新 • • 發佈:2022-05-03
有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 ---