细说Python编程:从入门到科学计算
上QQ阅读APP看书,第一时间看更新

2.1 Python的基本编码规范

很多语言都有其独特的代码风格,有些甚至发展成了一种编码规范。这种规范虽然对代码的运行没有太多影响,但却可以让程序员更好地阅读和理解代码。

Python采用PEP 8作为编码规范,其中PEP是Python Enhancement Proposal(Python增强建议书)的缩写,8代表的是Python代码的样式指南。

我们先来看图2-1所示的两段功能完全相同的代码。右侧的代码编写格式看上去比左侧的代码更加规整,阅读起来也更轻松、畅快,因为它遵循了基本的Python代码编写规范。如果在一个大的工程文件中出现较多的左边这种编码方式,将会给代码阅读者带来极大的困难。

下面仅给读者列出PEP 8中初学者应严格遵守的一些编码规范:

(1)建议每行不超过80个字符,如果超过,建议使用小括号将多行内容隐式地连接起来,而不推荐使用反斜杠“\”进行连接。例如,如果一个字符串文本无法实现一行完全显示,则可以使用小括号将其分开显示,代码如下:

图2-1 两段功能相同的Python代码

当Python程序代码太长需要换行时,可以使用括号“()”或者反斜杠“\”进行换行连接。这两种方式都可以实现代码换行,但使用括号“()”进行换行连接更加清晰和易于阅读,也更符合Python的代码风格规范:

注意,此编程规范适用于绝大多数情况,但以下两种情况除外:①导入模块的语句过长,②注释里的URL。

(2)通常情况下,在运算符两侧、函数参数之间以及逗号两侧,都建议使用空格进行分隔。

(3)使用必要的空行可以增加代码的可读性,通常在顶级定义(如函数或类的定义)之间空两行,而方法定义之间空一行,另外在用于分隔某些功能的位置也可以空一行。

(4)每个import语句只导入一个模块,尽量避免一次导入多个模块。

【例2-1】 模块导入示例。

输入如下代码:

     #推荐
     import os   #导入os模块
     import sys  #导入sys模块
     #不推荐
     import os,sys

(5)不要在行尾加分号,也不要用分号将两条命令放在同一行。

(6)使用括号宁缺毋滥,除非是用于实现行连接,否则不要在返回语句或条件语句中使用括号。不过在元组两边使用括号是可以的。

【例2-2】 括号应用示例。

输入如下代码:

(7)缩进。用4个空格来缩进代码,绝对不要使用Tab和空格混用,很容易出错。要么垂直对齐换行的元素,要么使用4个空格的悬挂式缩进。

(8)空行。顶级定义之间空两行,比如函数或者类定义。方法定义、类定义与第一个方法之间都应该空一行。在函数或方法中,某些地方如果觉得合适,就空一行。

(9)空格。按照标准的排版规范来使用标点两边的空格,括号内不要有空格。

【例2-3】 空格应用示例。

输入如下代码:

在二元操作符两边都加上一个空格,比如赋值操作符(=)、比较操作符(==、<、>、!=、<>、<=、>=、in、not in、is、is not)、布尔操作符(and、or、not)等。至于算术操作符两边空格的使用,需要自己认真判断,两侧务必要保持一致。

【例2-4】 操作符应用示例。

输入如下代码:

     # 推荐
     x = 1  #操作符=两边有空格
     # 不推荐
     x=4  #操作符=两边没有空格

当“=”用于指示关键字参数或默认参数值时,不要在其两侧使用空格。

【例2-5】 “=”应用示例。

输入如下代码:

     # 推荐
     def complex(real, imag=0.0): return magic(r=real, i=imag)
     # 不推荐
     def complex(real, imag = 0.0): return magic(r = real, i = imag)

(10)TODO注释。为临时代码使用TODO注释是一种短期解决方案。TODO注释应该在所有开头处包含TODO字符串,紧跟着是用括号括起来的名字、E-mail地址或其他标识符,然后是一个可选的冒号。接着必须有一行注释,解释要做什么。

主要目的是为了有一个统一的TODO格式,这样添加注释的人就可以搜索到(并可以按需提供更多细节)。写了TODO注释并不保证写的人会亲自解决问题,当写了一个TODO时需要注上名字。如果TODO是“将来做某事”的形式,那么请确保包含一个指定的日期或者一个特定的事件。

     # TODO(ww@163.com): Use a "*" here for string repetition.
     # TODO(ZZZ) Change this to use relations.

(11)导入格式。每个导入应该独占一行。

【例2-6】 导入格式示例。

输入如下代码:

     # 推荐
     import time    #导入时间模块
     import json    #导入json模块
     # 不推荐
     import time, json

导入应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。导入应该按照从最通用到最不通用的顺序分组:首先是标准库导入,然后是第三方库导入,最后是应用程序指定导入。

在每种分组中,应该根据每个模块的完整路径按字典序排序,忽略大小写。

【例2-7】 导入格式示例汇总。

输入如下代码: