
通常代碼不單單是寫給自己看的。
當(dāng)代碼出現(xiàn)bug而你又想不通哪有問(wèn)題時(shí),就需要把代碼貼到論壇或請(qǐng)身邊的人審閱。
或者你在公司上班,代碼需要交給上級(jí)審閱。
或者是你完成了某個(gè)項(xiàng)目,然后分享了你的結(jié)果,共享了你的代碼。
又或者你在Github上發(fā)起了一個(gè)開(kāi)源項(xiàng)目。
這些都需要?jiǎng)e人閱讀你的代碼,如果你的代碼格式混亂,別人就會(huì)失去耐心。這也就加大了你們之間的溝通成本。
所以有必要了解一些基礎(chǔ)的代碼風(fēng)格或習(xí)慣。
作為官方的Python 代碼風(fēng)格指南,必然要寫的詳細(xì),因?yàn)樾枰紤]所有的情形。但對(duì)于編程新手而言,閱讀完整份文檔確實(shí)有些劃不來(lái),因?yàn)椴恍枰鎸?duì)這么多情況。所以我總結(jié)了一份縮簡(jiǎn)版,記錄了最基礎(chǔ)的代碼風(fēng)格。
雖然是這里說(shuō)得是Python 代碼風(fēng)格,但實(shí)際上絕大多數(shù)內(nèi)容同樣適用于其它編程軟件。
作為編程新手,最需掌握的是四項(xiàng)內(nèi)容:命名,空格/空行,縮進(jìn), 注釋。
一、命名
- 變量名不要過(guò)于簡(jiǎn)單,盡量用能表達(dá)其含義的英文字母來(lái)表達(dá)。
Yes: num_student = len(student)
No: n = len(student)
- 不要使用小寫l(對(duì)應(yīng)大寫L)、大寫O和大寫I(對(duì)應(yīng)小寫i),因?yàn)樗鼈兒苋菀谆煜?/li>
- 類名需要首字母大寫
- 函數(shù)名小寫字母,并且各字母之間用_分隔
- 常量用大寫字母
二、空格/空行
通常賦值符或運(yùn)算符兩邊需要加上空格,x = a + b 要比 x=a+b 更加整潔。
不使用空格的情況
行末尾
行末尾的空格既沒(méi)有價(jià)值,又可能會(huì)造在bug。逗號(hào)與括號(hào)之間
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
- 與冒號(hào)有關(guān)時(shí)
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]
其它提醒
- 如果一個(gè)表達(dá)示中有多級(jí)運(yùn)算,可以在優(yōu)先級(jí)低的運(yùn)算符周邊使用空格,但最多使用一個(gè)空格:
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)
- 對(duì)于函數(shù)參數(shù)中的賦值符,不需要使用空格:
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)
- 二元運(yùn)算符應(yīng)該在第二個(gè)值之前
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
- 空行
函數(shù)與函數(shù)之間需要二個(gè)空行分隔。
函數(shù)之間的邏輯塊用空行來(lái)分隔,這樣可以更清楚地看清哪部分是相互關(guān)聯(lián)的。
三、縮進(jìn)
space VS tab
空格與制表符就是一對(duì)冤家,美劇《硅谷》中也特地用了幾個(gè)場(chǎng)景來(lái)描述它們對(duì)現(xiàn)實(shí)生活產(chǎn)生的麻煩。
指南中建議使用空格,而且每一級(jí)縮進(jìn)用四個(gè)空格。但我還是習(xí)慣用制表符,因?yàn)榘匆幌驴偙劝此南驴?。?dāng)然,制表符在不同的環(huán)境下可能會(huì)表示不同數(shù)量的空格,所以復(fù)制別人的代碼時(shí)可能會(huì)造成格式不一致。我想這也是指南中建議用空格的原因。
縮進(jìn)的數(shù)量
- 延長(zhǎng)部份需要對(duì)齊,比如
foo = long_function_name(var_one, var_two,
var_three, var_four)
- 為了方便閱讀,分隔不同意義的語(yǔ)句,使用不同的層級(jí),比如:
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)
四、注釋
注釋是為了讓人更快的理解函數(shù),如果你的注釋會(huì)造成誤解,還不如不寫注釋。所以當(dāng)你為一個(gè)函數(shù)寫了注釋,并且更改了函數(shù)代碼時(shí),必需要及時(shí)更新你的注釋。
注釋盡量用英文。
注釋總是要以#和空格開(kāi)始。
注釋塊:
注釋塊是對(duì)接下來(lái)的邏輯代碼塊進(jìn)行注釋。
注釋塊需要與解釋的代碼對(duì)齊,并且注釋塊中的段落用空行分隔。
注釋行
在 stetement 后的注釋稱為注釋行或行注釋。
注釋行與前面的 statement 至少空兩格。
文檔注釋:
文檔注釋是對(duì)函數(shù)的說(shuō)明,需要在 def 下一行就給出。使用三個(gè)引號(hào),并且最后的引號(hào)要單獨(dú)一行,比如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
五、其它
行長(zhǎng)
行長(zhǎng)控制在79字符之內(nèi)。
import
在文件開(kāi)頭就引入所有需要的庫(kù),并且每行只引入一個(gè)庫(kù)。引入順序?yàn)椋?/p>
- 標(biāo)準(zhǔn)庫(kù)
- 第三方庫(kù)
- 自己寫的類/庫(kù)
這三為類引入之間還需要空行分隔。
編程建議
如果需要表達(dá)
if x is not None就用if x即可。用到
try except語(yǔ)句時(shí)
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
函數(shù)中的return statement要保持一致,不要為了簡(jiǎn)便而省略return None