当前位置 : 主页 > 编程语言 > python >

编写高质量代码——改善Python程序的91个建议(Ⅱ)

来源:互联网 收集:自由互联 发布时间:2022-06-24
建议8:利用assert语句来发现问题 Python并没有严格定义调式和发布模式之间的区别,通常禁用断言 的方法是在运行脚本的时候加上-O标志。 不要滥用,通常用在正常逻辑不可到达的地方
  • 建议8:利用assert语句来发现问题
    Python并没有严格定义调式和发布模式之间的区别,通常禁用断言 的方法是在运行脚本的时候加上-O标志。
  • 不要滥用,通常用在正常逻辑不可到达的地方或正常情况下总是为真的场合。
  • 如果Python本身的异常能够处理就不要再使用断言。
  • 不要使用断言来检查用户的输入。
  • 在函数调用后,当需要确认返回值是否合理时可以使用断言。
  • 当条件是业务逻辑继续下去的先决条件时可以使用断言。
  • 建议9:数据交换时不推荐使用中间变量
  • x, y = y, x 性能更优。 其在内存中执行的顺序如下:
  • 先计算右边的表达式y,x,因此先在内存中创建元组(y,x),其标识符和值分别为y、x及其对应的值,其中y和x是在初始化时已经存在于内存中的对象。
  • 计算表达式左边的值并进行赋值,元组被依次分配给左边的标识符,通过解压缩,元组第一标识符(y)分配给左边第一个元素(x),元组的第二个标识符(x)分配给第二个元素(y),从而达到x、y交换的目的。
  • 建议10:充分利用Lazy evaluation的特性
    Lazy evaluation即“延迟计算”或者“惰性计算”,指的是仅仅在真正需要执行的时候才计算表达式的值。
  • 避免不必要的计算,带来性能上的提升。比如:if x and y 和 if x or y。
  • 生成器表达式。
def fib():
a,b = 0, 1
while True:
yield a
a, b = b, a + b

  • 建议11:理解枚举替代实现的缺陷
    这块没怎么看懂。
  • 建议12:不推荐使用type来进行类型检查
  • 不刻意进行类型检查,而是在出错的情况下通过抛出异常来进行处理,这是较为常见方式。
  • 基于内建类型扩展的用户自定义类型,type函数并不能准确返回结果。
  • 如果类型有对应的工厂函数,可以使用工厂函数做相应转换,如list(listing)、str(name)等,否则可以使用isinstance()函数来检查。
  • 建议13:尽量转换为浮点类型后再做除法
  • 当涉及除法运算时先将操作数转换为浮点类型再做运算(Python3.x不存在此问题)。
  • 浮点数会不精确?
i = 1
while i = 1.5:
i += 0.1
print(i)

很可能会无限循环。
循环条件尽可能设置为整数。


  • 建议14:警惕eval()的安全漏洞
    python中eval()函数将字符串str当成有效的表达式来求值并返回计算结果,这就有空可钻。
  • 在实际应用过程中如果对象不是信任源,应该尽量避免使用eval,在需要使用eval的地方可用安全性更好的ast.literal_eval替代。
  • 使用enumerate()获取序列迭代的索引和值
    代码清晰简洁,可读性好。函数返回本质上为一个迭代器。
li = [1,2,3,4,5,6]
for i, e in enumerate(li):
print("index:",i,"element:",e)
  • 在使用字典获取key, value时,使用iteritems()方法。
  • 建议16:分清 == 与 is

操作符

意 义

is

object identity

==

equal

is: 用来检测两个对象在内存中是否拥有同一块内存空间(相当于id(x)==id(y))
==: 检测两个值是否相等

  • 建议17:考虑兼容性,尽可能使用Unicode
  • str.decode([ 编码参数 [, 错误处理]] )
  • str.encode([ 编码参数 [, 错误处理]] )

码参数

描述

‘ascii’

7位ASCII码

‘latin-1’ or ‘iso-8859-1’

ISO 8859-1, Latin-1

‘utf-8’

8位可变长度编码

‘utf-16’

16位可变长度编码

‘utf-26-le’

UTF-16, little-endian编码

‘utf-16-b’

UTF-16, big-endian编码

‘unicode-escape’

与unicode文字u’string’相同

‘raw-unicode-escape’

与原始unicode文字ur‘string’相同

总之,是个好复杂的问题…

  • 建议18:构建合理的包层次来管理module
  • 包文件中的__init__.py的作用?可以将包和普通目录区分;在该文件中声明模块级别的import语句从而使其变成包级别可见。
  • 合理组织代码,便于维护和使用。
  • 能够有效地避免名称空间冲突。
    编写高质量代码——改善Python程序的91个建议(Ⅱ)_ico

- 《编写高质量代码 改善Python程序的91个建议》张颖 赖勇浩 著。


上一篇:Python绘制图像(Matplotlib)(Ⅳ)
下一篇:没有了
网友评论