Python规范:代码规范要注意
2024-10-01 14:49:38
主要有以下两种代码规范
- 《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 要更严格些。
统一的编程规范为什么重要?
开发效率,关乎三类对象,也就是阅读者、编程者和机器。他们的优先级是阅读者的体验 >> 编程者的体验 >> 机器的体验。
阅读者的体验 >> 编程者的体验
不少的编程规范,本来就是为了优化读者体验而存在的。举个例子,对于命名原则,我想很多人应该都有所理解,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]
以上的代码看起来又累又费劲,转个头可能自已也得看半天。换成简单的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__() 方法的具体实现
#错误示例
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核心技术与实战》专栏
最新文章
- Marshal.Copy将指针拷贝给数组
- php如何防止图片盗用/盗链的两种方法
- bzoj1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
- Python-3 语法
- Selenium2学习-012-WebUI自动化实战实例-010-解决元素失效:StaleElementReferenceException: stale element reference: element is not attached to the page document
- paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]
- linux下利用openssl来实现证书的颁发(详细步骤)
- pm
- Vuex原来可以这样上手
- .Net程序猿需掌握的知识
- Maven打包Jar
- 关于IDEA无法引入包和类的情况
- 漫话JavaScript与异步&#183;第三话——Generator:化异步为同步
- 查阅API文档
- 一致性 Hash 算法的实际应用
- Ionic2+WebApi 导出Excel转Pdf文件。
- Java表达式转型规则
- Markdown 标题
- 【刷题】BZOJ 4945 [Noi2017]游戏
- Linux学习4-远程登录管理工具安装
热门文章
- thinkphp 打印sql语句方法
- 洛谷 P3469 [POI2008]BLO-Blockade 题解
- WinDbg常用命令系列---!htrace
- 【批处理】choice命令,call 命令,start 命令,rem
- nginx syslog 配置
- 56、Spark Streaming: transform以及实时黑名单过滤案例实战
- JS实现Base64编码、解码,即window.atob,window.btoa功能
- GoCN每日新闻(2019-10-02)
- MintUI引入vue项目以及引入iconfont图标
- 忽略 IDEA 文件