本小节并不打算按照PEP 8的标准来介绍代码风格;而是打算以举例的方式,来塑造代码风格的深层价值观;不必强记,而是用心去感受哪种coding的风格更加优雅。
人无完人,对代码风格的要求,无须苛责,无须一定要完全按照某个代码风格的标准去做。但是一定要心存敬畏、心存顾忌、心存对美的追求;因为代码不仅仅是给机器去运行的,也是给人去看的。形成好的习惯,会让写出的代码倾国倾城、沉鱼落雁。
总之一句话,代码要写的尽量好看一些。
在逗号后面、赋值符号、运算符号之间,请不要吝啬空格,加上空格,看起来更舒服一些。
Bad
a=1
b=2*3
c=[1,2,3]
d={'k1':'v1','k2':'v2','k3':'v3'}
Good
a = 1
b = 2 * 3
c = [1, 2, 3]
d = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
适当地添加空行可让人更容易地把握代码的逻辑。
Bad
import math
def output_pi():
print math.pi
output_pi()
Good
import math
def output_pi():
print math.pi
output_pi()
如下所示,若条件表达式过长,则不要吝啬变量,这样就不会导致某一行太长。
Bad
if <一个很长的条件表达式> and <另一个很长的条件表达式>:
# do something
Good
cond1 = <一个很长的条件表达式>
cond2 = <另一个很长的条件表达式>
if cond1 and cond2:
# do something
之前说过推导式的方式,这种方式非常pythonic,能用推导式达到目的就用;因为推导式更少代码、看起来逻辑也更加清楚。
Bad
a = []
for i in xrange(20):
if i % 2 == 0:
a.append( i )
Good
a = [i for i in xrange(20) if i % 2 == 0]
非空字符串在布尔测试中都是等价于True的;不等于0的整型或不等于0.0的浮点型都等价于True。此外布尔型在if语句中,可以直接检查,没必要去判断是否等于True或False。
Bad
if cond1 == True:
print 'True!'
if cond2 == None:
print 'None!'
Good
if cond1:
print 'True!'
if not cond2:
print 'None!'
if cond2 is None:
print 'None!'
如果要获取字典某个键的值,但不确定该键是否在字典中,请尽量使用字典的get方法来获取对应的值。
Bad
d = {'zhuan': 'fou'}
if d.has_key('zhuan'):
print d['zhuan'] # will print 'fou'
else:
print 'default value'
Good
d = {'zhuan': 'fou'}
print d.get('zhuan', 'default value') # will print 'fou'
print d.get('key', 'default value') # will print 'default value'
针对代码风格这件事,这里的观点是“以意为先”,不必太过拘泥于标准;大体上按着这个感觉,做到价值取向上符合即可。(也许会有人不认同这个观点,认为代码风格应该完全符合某个标准;争议是一件很正常的事情,本小节对代码风格的观点仅供参考。)