Python规范:代码规范要注意

主要有如下两种代码规范

  • 《8 号 Python 加强规范》(Python Enhacement Proposal #8),如下简称 PEP8;
  • 《Google Python 风格规范》(Google Python Style Guide),如下简称 Google Style,这是源自 Google 内部的风格规范。公开发布的社区版本,是为了让 Google 旗下全部 Python 开源项目的编程风格统一。(http://google.github.io/styleguide/pyguide.html)
  •  Google  Python Style Guide 要更严格些。

统一的编程规范为何重要?

  开发效率,关乎三类对象,也就是阅读者、编程者和机器。他们的优先级是阅读者的体验 >> 编程者的体验 >> 机器的体验。html

阅读者的体验 >> 编程者的体验

  很多的编程规范,原本就是为了优化读者体验而存在的。举个例子,对于命名原则,我想不少人应该都有所理解,PEP8 第 38 条规定命名必须有意义,不能是无心义的单字母。如:git

错误示例
if (a <= 0):
   return
elif (a > b):
   return
else:
  b -= a

# 正确示例
if (transfer_amount <= 0):
   raise Exception('...')
elif (transfer_amount > balance):
   raise Exception('...')
else:
  balance -= transfer_amount

  再举一个例子,Google Style 2.2 条规定,Python 代码中的 import 对象,只能是 package 或者 module。github

#错误示例
from mypkg import Obj
from mypkg import my_func

my_func([1, 2, 3])

# 正确示例
import numpy as np
import mypkg

np.array([6, 7, 8])

编程者的体验 >> 机器的体验

#错误示例
result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
  以上的代码看起来又累又费劲,转个头可能自已也得看半天。换成简单的for loop,就能够更简洁与明了。
# 正确示例
result = []
for x in range(10):
  for y in range(5):
     if x * y > 10:
       result.append((x, y))

 机器的体验也很重要

   一些危险的编程风格,不只会影响程序正确性,也容易成为代码效率的瓶颈。好比, is 和 ==的使用区别。is是比较对象的内存地址。所以在比较整数的地址时要注意。编程

 

#################实验证实,下面代码只在终端中执行Python命令行时才有效,而在执行脚本时整型的数据都会分配同一个空间
#错误示例
x = 27
y = 27
print(x is y) #True

x = 721
y = 721
print(x is y) #False
#以上的代码的改为==,确保是对比对象的值。
#正确示例
x = 27
y = 27
print(x == y)

x = 721
y = 721
print(x == y)

  再看 == ,当比较的是对象或者None时,有可能就会出乎意料,由于==的结果,取决于__eq__() 方法的具体实现app

#错误示例
class MyObject(object):
    def __eq__(self, other):
        if other:
            return self.field == other.field
        return True

x = MyObject()
print(x == None)

  若是要与None比较时,永远要使用is和is notide

# 正确示例
x = MyObject()
print(x is None)
正确示例
def pay(name, salary=None):
 if salary is not None:
   salary = 11
 print(name, "is compensated", salary, "dollars")

  再提一个错误示范oop

#错误示例
adict = {i: i * 2 for i in xrange(10000000)}

for key in adict.keys():
   print("{0} = {1}".format(key, adict[key]))

  keys() 方法会在遍历前生成一个临时的列表,致使上面的代码消耗大量内存而且运行缓慢。正确的方式,是使用默认的 iterator。默认的 iterator 不会分配新内存,也就不会形成上面的性能问题:性能

# 正确示例
for key in adict:

参考

  摘自 《Python核心技术与实战》专栏优化