本小节并不打算按照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'
针对代码风格这件事,这里的观点是“以意为先”,不必太过拘泥于标准;大体上按着这个感觉,做到价值取向上符合即可。(也许会有人不认同这个观点,认为代码风格应该完全符合某个标准;争议是一件很正常的事情,本小节对代码风格的观点仅供参考。)