1.3 Python编程规范与代码优化建议
没有规矩,不成方圆。任何一种语言都有一些约定俗成的编码规范,Python也不例外。Python非常重视代码的可读性,对代码布局和排版有更加严格的要求。虽然一些大型软件公司对自己公司程序员编写的代码在布局、结构、标识符命名等方面有一些特殊的要求,但其中很多思想是相同的,目的也是一致的。这里重点介绍Python社区对代码编写的一些共同的要求、规范和一些常用的代码优化建议,最好在开始编写第一段代码的时候就要遵循这些规范和建议,养成一个好的习惯。
(1)严格使用缩进来体现代码的逻辑从属关系。Python对代码缩进是硬性要求,这一点必须时刻注意。如果某个代码段的缩进不对,那么整个程序就是错的,要么是语法错误无法执行,要么是逻辑错误导致错误结果,而检查这样的错误会花费很多时间。
(2)每个import语句只导入一个模块,最好按标准库、扩展库、自定义库的顺序依次导入。尽量避免导入整个库,最好只导入确实需要使用的对象,这会让程序运行更快。
(3)最好在每个类、函数定义和一段完整的功能代码之后增加一个空行,在运算符两侧各增加一个空格,逗号后面增加一个空格。按照这样的规范写出来的代码布局和排版比较松散,阅读起来更加轻松。不论是前面第一条讲的缩进,还是这里谈的空行与空格,主要是提高代码可读性,正如The Zen of Python所说:Sparse is better than dense、Readability counts。稍微有点例外的是,在正常的赋值表达式中等号两侧都是各增加一个空格,但在定义函数的默认值参数和使用关键参数调用函数时一般并不在参数赋值的等号两侧增加空格。这样松中有紧也是为了提高代码的可读性,正所谓“张而不弛,文武弗能也;弛而不张,文武弗为也;一张一弛,文武之道也。”
(4)尽量不要写过长的语句。如果语句过长,可以考虑拆分成多个短一些的语句,以保证代码具有较好的可读性。如果语句确实太长而超过屏幕宽度,最好使用续行符(line continuation character)“\”,或者使用圆括号将多行代码括起来表示是一条语句。
(5)虽然Python运算符有明确的优先级,但对于复杂的表达式建议在适当的位置使用括号使得各种运算的隶属关系和顺序更加明确,正如The Zen of Python所说:Explicit is better than implicit。
(6)对关键代码和重要的业务逻辑代码进行必要的注释。统计数据表明,一个可读性较好的程序中应包含大概30%以上的注释。在Python中有两种常用的注释形式:#和三引号。#用于单行注释,三引号常用于大段说明性文本的注释。
(7)在开发速度和运行速度之间尽量取得最佳平衡。内置对象运行速度最快,标准库对象次之,用C或FORTRAN编写的扩展库速度也比较快,而纯Python的扩展库往往速度慢一些。因此,在开发项目时,应优先使用Python内置对象,其次考虑使用Python标准库提供的对象,最后考虑使用第三方扩展库。然而,有时候只使用内置对象和标准库对象的话,很可能无法直接满足需要。这时候有两个选择:一是使用内置对象和标准库对象编写代码实现特定的逻辑;二是使用合适的扩展库对象。至于如何取舍,最终还是取决于业务逻辑的复杂程度和对运行速度的要求这两者之间的平衡。
(8)根据运算特点选择最合适的数据类型来提高程序的运行效率。如果定义一些数据只是用来频繁遍历,最好优先考虑元组或集合。如果需要频繁地测试一个元素是否存在于一个序列中并且不关心其位置,尽量采用字典或者集合。列表和元组的in操作的时间复杂度是线性的,而对于集合和字典却是常数级的,与问题规模几乎无关。在所有内置数据类型中,列表的功能最强大,但开销也最大,运行速度最慢,应慎重使用。作为建议,应优先考虑使用集合和字典,元组次之,最后再考虑列表和字符串。
(9)充分利用关系运算符以及逻辑运算符and和or的惰性求值特点,合理组织条件表达式中多个条件的先后顺序,减少不必要的计算。
(10)充分利用生成器对象或类似迭代对象的惰性计算特点,尽量避免将其转换为列表、元组等类型,这样可以减少对内存的占用,降低空间复杂度。
(11)减少内循环中的无关计算,尽量往外层提取。
有很多成熟的工具可以检查Python代码的规范性,例如pep8、flake8、pylint等。可以使用pip来安装pep8工具,然后使用命令pep8 test.py来检查test.py文件中Python代码的规范性。pep8常用的可选参数有--show-source、--first、--show-pep8等。flake8结合了pyflakes和pep8的特点,可以检查更多的内容,优先推荐使用,使用pip install flake8可以直接安装,然后使用命令flake8 test.py检查test.py中代码的规范性。也可以使用pip安装pylint,然后使用命令行工具pylint或者可视化工具pylint-gui来检查程序的规范性。