目的:提高源程序的质量和可维护性
缩进
- 一律使用4个空格代表一层缩进,不允许使用Tab
- 一行字符最多为79个,既在80列时换行
- 对顺序排放的大块文本(文档字符串或注释),推荐将长度限制在72字符
折叠长行
使用Pyhon支持的圆括号,方括号和花括号内的行延续。如果需要,你可以在表达式周围增加一对额外的圆括号,但是有时使用反斜杠看起来更好,恰当得缩进可以看出延续的行。
下面是一个示例(增加一对额外的圆括号):
if (2 > 1 and 4 > 2
and 8 < 99):
print('Ok!')
下面是更好的示例(使用反斜杠):
if 2 > 1 and 4 > 2 \
and 8 < 99:
print('Ok!')
行间距
- 如果函数不在类中,则函数与函数之间,空两行。
- 如果函数在同一类中,则函数与函数之间,空一行。
- 类和类之间,空两行
注释
修改代码同时修改相应的注释,保证注释与代码的一致性
注释块:通常由一个或多个由完整句子构成的段落组成,每个句子应该以句号结尾。注释块通常应用于跟随着一些(或者全部)代码并和这些代码有着相同的缩进层次。注释块中每行以’#‘和一个空格开始(除非他是注释内的缩进文本)。注释块内的段落以仅含单个’#'的行分割。注释块上下方最好有一空行包围(或上方两行下方一行,对一个新函数定义段的注释)。
行内注释:应该至少用两个空格和语句分开,它们应该以’#'和单个空格开始。
文档字符串:为所有公共模块,函数,类和方法编写文档字符串。文档字符串对非公开的方法不是必要的,但你应该有一个描述这个方法做什么的注释。 对单行的文档字符串,结尾的"""
在同一行也可以。
"""
训练
数据预处理+正则化(归一化)
用均值代替NaN
删除行
多个特 征全特征 (根据是否去掉某特征列)
预测
均值补全
根据不同特征列进行模型选择 (缺失多的话去掉特征)
因数据有些地方为空 可能多个SVM模型
路线PCA/AutoEncoder+SVM(RBF)
"""
标识符命名
以下的命名风格是众所周知的:
b(单个小写字母)
B(单个大写字母)
lowercase(小写)
lower_case_with_underscores(有下划线的小写)
UPPERCASE(大写)
UPPER_CASE_WITH_UNDERSCORES(有下划线的大写)
CapitalizedWords(或CapWords,CamelCase这样命名是因为可从字母的大小写分出单词)
mixedCase (与CapitalizedWords的不同在于首字母小写!)
single_trailing_underscore_(单个下划线结尾): 用于避免与Python关键词的冲突,例如:"Tkinter.Toplevel(master,class_='ClassName')"
应避免的名字:永远不要用字符’l’(小写字母el(就是读音,下同)),‘O’(大写字母oh),或’I’(大写字母eye)作为单字符的变量名。在某些字体中这些字符不能与数字1和0分辨。试着在使用’l’时用’L’代替。
模块名:模块应该是不含下划线的,简短的,小写的名字。
类名:使用CapWords约定。内部使用的类外加一个前导下划线。
函数名:应该为小写,可能用下划线风格单词以增加可读性。mixedCase仅被允许用于这种风格已经占优势的上下文(如:threading.py),以便保持向后兼容。
如果一个函数参数名字包括保留的关键字,通常在参数末加上下画线,而不要使用简写,因此"print_" 要比"prnt"好一些
模块导入
通常应该在单独的行中导入(import),例如:
No:
import sys, os
Yes:
import sys
import os
但是这样也是可以的:
from types import StringType, ListType
Imports 通常被放置在文件的顶部,仅在模块注释和文档字符串之后,在模块的全局变量和常量之前。
Imports应该有顺序地成组安放:
1、标准库的导入(Imports )
2、相关的主包(major package)的导入(即,所有的email包在随后导入)
3、特定应用的导入(imports)
应该在每组导入之间放置一个空行
表达式和语句
紧挨着圆括号,方括号和花括号的,如:
- Yes:
spam(ham[1], {eggs: 2})
- No:
spam( ham[ 1 ], { eggs: 2 } )
紧贴在逗号,分号或冒号前的,如:
- Yes:
if x == 4: print x, y; x, y = y, x
- No:
if x == 4 : print x , y ; x , y = y , x
紧贴着函数调用的参数列表前开式括号(open parenthesis )
- Yes: func(1)
- No: func (1)
紧贴在索引或切片,开始的开式括号前的,如:
- Yes: dict[‘key’] = list[index]
- No: dict [‘key’] = list [index]
另外:
1、始终在这些二元运算符两边放置一个空格:赋值(=), 比较(==,<,>,!=,<=,>=,in,not in,is,is not),布尔运算 (and,or,not)。 始终保持二元运算符两边空格的一致。
submitted += 1
2、不要在用于指定关键字参数或默认参数值的’='号周围使用空格。
Yes:
def complex(real, imag=0.0):
return magic(r=real, i=imag)
No:
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
其他建议
1、单个元素(singletons)的比较,如None 应该永远用:'is’或’is not’来做。当你本意是"if x is not None"时,对写成"if x"要小心。例如当你测试一个默认为None的变量或参数是否被设置为其它值时,这个值也许在布尔上下文(Boolean context)中是false!
2、对象类型的比较应该始终用isinstance()代替直接比较类型,例如:
- No: if type(obj) is type(1)
- Yes: if isinstance(obj, int):
3、对序列,(字符串,列表,元组),使用空列表是false这个事实,
- Yes: if not seq:
if seq: - No: if len(seq)
if not len(seq)
4、不要用==
来比较布尔型的值以确定是True或False:
- Yes: if greeting:
- No: if greeting == True:
- Worse: if greeting is True:
END