通常代码不单单是写给自己看的。
当代码出现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