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】 导入格式示例汇总。
输入如下代码: