通常代碼不單單是寫給自己看的。
當代碼出現bug而你又想不通哪有問題時,就需要把代碼貼到論壇或請身邊的人審閱。
或者你在公司上班,代碼需要交給上級審閱。
或者是你完成了某個項目,然后分享了你的結果,共享了你的代碼。
又或者你在Github上發起了一個開源項目。
這些都需要別人閱讀你的代碼,如果你的代碼格式混亂,別人就會失去耐心。這也就加大了你們之間的溝通成本。
所以有必要了解一些基礎的代碼風格或習慣。
作為官方的Python 代碼風格指南,必然要寫的詳細,因為需要考慮所有的情形。但對于編程新手而言,閱讀完整份文檔確實有些劃不來,因為不需要面對這么多情況。所以我總結了一份縮簡版,記錄了最基礎的代碼風格。
雖然是這里說得是Python 代碼風格,但實際上絕大多數內容同樣適用于其它編程軟件。
作為編程新手,最需掌握的是四項內容:命名,空格/空行,縮進, 注釋。
一、命名
- 變量名不要過于簡單,盡量用能表達其含義的英文字母來表達。
Yes: num_student = len(student)
No: n = len(student)
- 不要使用小寫l(對應大寫L)、大寫O和大寫I(對應小寫i),因為它們很容易混淆
- 類名需要首字母大寫
- 函數名小寫字母,并且各字母之間用_分隔
- 常量用大寫字母
二、空格/空行
通常賦值符或運算符兩邊需要加上空格,x = a + b
要比 x=a+b
更加整潔。
不使用空格的情況
行末尾
行末尾的空格既沒有價值,又可能會造在bug。逗號與括號之間
Yes: foo = (0,)
No: bar = (0, )
- 緊跟著變量
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
- 與冒號有關時
Yes:
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
No:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
其它提醒
- 如果一個表達示中有多級運算,可以在優先級低的運算符周邊使用空格,但最多使用一個空格:
Yes:
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
No:
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
- 對于函數參數中的賦值符,不需要使用空格:
Yes:
def complex(real, imag=0.0):
return magic(r=real, i=imag)
No:
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
- 二元運算符應該在第二個值之前
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
- 空行
函數與函數之間需要二個空行分隔。
函數之間的邏輯塊用空行來分隔,這樣可以更清楚地看清哪部分是相互關聯的。
三、縮進
space VS tab
空格與制表符就是一對冤家,美劇《硅谷》中也特地用了幾個場景來描述它們對現實生活產生的麻煩。
指南中建議使用空格,而且每一級縮進用四個空格。但我還是習慣用制表符,因為按一下總比按四下快。當然,制表符在不同的環境下可能會表示不同數量的空格,所以復制別人的代碼時可能會造成格式不一致。我想這也是指南中建議用空格的原因。
縮進的數量
- 延長部份需要對齊,比如
foo = long_function_name(var_one, var_two,
var_three, var_four)
- 為了方便閱讀,分隔不同意義的語句,使用不同的層級,比如:
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
而不是:
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
四、注釋
注釋是為了讓人更快的理解函數,如果你的注釋會造成誤解,還不如不寫注釋。所以當你為一個函數寫了注釋,并且更改了函數代碼時,必需要及時更新你的注釋。
注釋盡量用英文。
注釋總是要以#和空格開始。
注釋塊:
注釋塊是對接下來的邏輯代碼塊進行注釋。
注釋塊需要與解釋的代碼對齊,并且注釋塊中的段落用空行分隔。
注釋行
在 stetement 后的注釋稱為注釋行或行注釋。
注釋行與前面的 statement 至少空兩格。
文檔注釋:
文檔注釋是對函數的說明,需要在 def
下一行就給出。使用三個引號,并且最后的引號要單獨一行,比如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
五、其它
行長
行長控制在79字符之內。
import
在文件開頭就引入所有需要的庫,并且每行只引入一個庫。引入順序為:
- 標準庫
- 第三方庫
- 自己寫的類/庫
這三為類引入之間還需要空行分隔。
編程建議
如果需要表達
if x is not None
就用if x
即可。用到
try except
語句時
Yes:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
No:
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
- return
函數中的return statement
要保持一致,不要為了簡便而省略return None