分析一套源代码的代码规范和风格并讨论如何改进优化代码
我的课题做的NLP转让语言处理,接下来我就结合一套课题相关的简单代码来分析它的代码风格和规范
1.目录结构
如上图所示,该代码目录的规划比较清晰,主要分为new_data.7z为训练数据集,以及训练模型train_set.csv,test_set.csv为定义模型,以及语言处理模块com2018.py。
2.代码结构和规范分析
1 # -*- coding: utf-8 -*- 2 print("开始..............") 3 4 import pandas as pd 5 from sklearn.linear_model import LogisticRegression 6 from sklearn.feature_extraction.text import CountVectorizer 7 8 df_train = pd.read_csv('./train_set.csv') 9 df_test = pd.read_csv('./test_set.csv') 10 df_train.drop(columns=['article','id'],inplace=True) 11 #pandas的drop函数:删除表中的某一行或者某一列,当inplace手动设为True时(默认为false),改变原有的df中的数据,原数据直接就被替换。 12 13 df_test.drop(columns=['article'],inplace=True) 14 15 vectorizer = CountVectorizer(ngram_range=(1,2),min_df=3,max_df=0.9,max_features=100000) 16 17 #文本特征提取方法:CountVectorizer,它只考虑每种词汇在该训练文本中出现的频。 18 #CountVectorizer算法是将文本向量转换成稀疏表示数值向量(字符频率向量)。 19 #该数值向量可以传递给其他算法,譬如LDA 。在fitting过程中,CountVectorizer将会把频率高的单词排在前面。可选参数minDF表示文本中必须出现的次数(具体分析见另一篇博客啦~) 20 21 vectorizer.fit(df_train['word_seg']) 22 # 先拟合训练集'word_seg'列的数据 23 24 x_train = vectorizer.transform(df_train['word_seg']) 25 # 再标准化训练集'word_seg'列数据,tranform()的作用是通过找中心和缩放等实现标准化 26 27 x_test = vectorizer.transform(df_test['word_seg']) 28 # 标准化测试集'word_seg'列数据 29 30 y_train = df_train['class']-1 31 #将训练集y 标签为'class'列的数据全部减一 32 33 lg = LogisticRegression(C=4,dual=True) 34 # 使用LogisticRegression每次指定一个正则化系数C。 35 36 lg.fit(x_train,y_train) 37 #Fit the model according to the given training data 38 39 y_test = lg.predict(x_test) 40 #根据输入的测试集x输出预测的y值 41 42 df_test['class'] = y_test.tolist() 43 #将预测结果转化为list赋值给测试集中'class'一列 44 45 df_test['class'] = df_test['class']+1 46 #该列每一个值加一 47 48 df_result = df_test.loc[:,['id','class']] 49 #选取'id','class'两列作为结果集 50 51 df_result.to_csv('./result.csv',index=False) 52 #保存结果 53 print("完成...............")
先看上面的文件命名
df_train = pd.read_csv('./train_set.csv')
df_test = pd.read_csv('./test_set.csv')
df_train.drop(columns=['article','id'],inplace=True)
上面的函数命名采用单词加下划线的格式很好的表明了函数的作用,清晰明了,使读者能够很快的明白函数的使用方法和用途。同时在这代码里面,变量
的命名也是比较符合规范的,对于df_test和df_result的命名也是能让读者很清晰的了解到该变量的意义,并不是简单的命名为x,y,z
增加了函数的易读性.而且,这段代码有很好的注释,在帮助读者阅读有很大的帮助,使读者对每段内容和目的清晰明了。
3.接口定义规范
1 @PostMapping("/delete") 2 public Map<String, Object> delete(long id, String lang) { 3 } 4 // 成功返回boolean,失败返回string,大忌 5 @PostMapping("/delete") 6 public Object delete(long id, String lang) { 7 try { 8 boolean result = configService.delete(id, local); 9 return result; 10 } catch (Exception e) { 11 log.error(e); 12 return e.toString(); 13 } 14 }
统一的接口规范,能帮忙规避很多无用的返工修改和可能出现的问题,能使代码可读性更加好。在本段代码的接口定义中,返回格式统一,且充分考虑了失败的情况,对参数的输入输出都有比较严格的规定可以说在接口定义方面做得比较符合规范。
4.同类编程语言或项目在代码规范和风格的一般要求
本项目编程主要是用python进行编程,因此本文的编程规范主要使用python的编程规范:
- 不要在行尾加分号, 也不要用分号将两条命令放在同一行。
- 控制行长度,每行不超过80个字符(注释url除外)
- 注意括号的使用,除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.
- 缩进:用4个空格来缩进代码,不要用tap,也不要tap和空格混合使用。
- 空行:顶级定义之间空两行, 方法定义之间空一行,顶级定义之间空两行。
- 空格:按照标准的排版规范来使用标点两边的空格,括号内不要有空格.,按照标准的排版规范来使用标点两边的空格。
- 注释:确保对模块, 函数, 方法和行内注释使用正确的风格
有上面的代码规定可知,本文中分享的代码比较符合代码的