发布于2019-08-05 12:11 阅读(824) 评论(0) 点赞(1) 收藏(0)
开发效率,关乎三类对象,也就是阅读者、编程者和机器。他们的优先级是阅读者的体验 >> 编程者的体验 >> 机器的体验。
不少的编程规范,本来就是为了优化读者体验而存在的。举个例子,对于命名原则,我想很多人应该都有所理解,PEP8 第 38 条规定命名必须有意义,不能是无意义的单字母。如:
错误示例 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。
#错误示例 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]
# 正确示例 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__() 方法的具体实现
#错误示例 class MyObject(object): def __eq__(self, other): if other: return self.field == other.field return True x = MyObject() print(x == None)
如果要与None比较时,永远要使用is和is not
# 正确示例 x = MyObject() print(x is None) 正确示例 def pay(name, salary=None): if salary is not None: salary = 11 print(name, "is compensated", salary, "dollars")
再提一个错误示范
#错误示例 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核心技术与实战》专栏
作者:3434erer
链接:https://www.pythonheidong.com/blog/article/4522/090bc0b3a45695f8960a/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!