正文之前
這篇文是我跟師兄協定以后寫代碼的一些規范,雖然麻煩,但是對于后續的復查以及代碼延續都有很大的好處的。
正文
必須統一的:
文件頭
寫入作者姓名,文件作用
"""
###################### File Introduction ######################
* Author: ZZB
* Function:這個文件主要用于定義中文拆分的一些函數和文件讀寫
######################*******************######################
"""
函數規范
Function: 寫出該函數的作用,標準為:接受XXX的調用(可有可無,視功能而定),傳入XXX參數,返回XXX
Args:列出每個參數的名字, 并在名字后使用一個冒號和一個空格, 分隔對該參數的描述.如果描述太長超過了單行80字符,使用2或者4個空格的懸掛縮進(與文件其他部分保持一致). 描述應該包括所需的類型和含義. 如果一個函數接受foo(可變長度參數列表)或者bar (任意關鍵字參數), 應該詳細列出foo和bar.
Returns: (或者 Yields: 用于生成器)描述返回值的類型和語義. 如果函數返回None, 這一部分可以省略.
Raises:列出與接口有關的所有異常(這一部分如果有,就寫清楚,沒有就ignore).
"""
###################
# * function:這個get_radical函數用于接受中文字符串,返回拆解的偏旁數組
# * args:(Chinses_string)
# * Chinses_string:中文字符串
# * return radicals
# * radicals是一個偏旁組成的數組[a,b,c,d,e]
# * raise:未設置異常檢測
###################
"""
def get_radical(Chinses_string)
......
return radicals
TODO注釋
TODO注釋應該在所有開頭處包含”TODO”字符串, 另外必須添加后續需要做的功能及其設想,以及可選的下列信息:
- TODO填寫人
- 后續工作完成者
# TODO
# Submiter:張照博
# Complete:唐訓祝
# Email:zzb@hust.edu.cn
def get_radical(Chinese_string)
pass
代碼日志
在主運行程序下,把所有有意義的(篇幅不大,便于人閱讀的)中間結果write到一個log的日志文件里面去。同時建議以時間和當前文件名作為log日志的文件名。示例如下:
"""
# ###################在文件開頭加這些就OK了###################
import os
import time
path = os.path.basename(__file__)
time = time.strftime("%Y-%m-%d-%H-%M", time.localtime())
log = open("log/"+path[:path.find('.')]+time+".log",'w',encoding='utf8')
# ###################*************************###################
"""
ram_range=(1,1) #表示
unigram, ngram_range=(2,2) #表示
bigram, ngram_range=(3,3) #表示 thirgram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["為了祖國,為了勝利,向我開炮!向我開炮!",
"記者:你怎么會說出那番話",
"我只是覺得,對準我自己打"]
data = [" ".join(jieba.lcut(e)) for e in data] # 分詞,并用" "連接
vector = CountVectorizer(min_df=1, ngram_range=(2,2)) # bigram
X = vector.fit_transform(data) # 將分詞好的文本轉換為矩陣
print(vector.vocabulary_ ) # 得到特征
###########有些變量可以print但是無法write,這時候加個類型轉換就好了###########
log.write(str(vector.vocabulary_))
###########***********************************************************###########
print(X) #(句子下標, 單詞特征下標) 頻數
log.write(str(X))
df1 = pd.DataFrame(X.toarray(), columns=vector.get_feature_names()) # to DataFrame
df1.head()
###############記得最后要close日志文件###############
log.close()
###############************************###############
可改進的:
字符串
避免在循環中用+和+=操作符來累加字符串.
Yes: x = '%s, %s!' % (imperative, expletive)
x = '{}, {}!'.format(imperative, expletive)
x = 'name: %s; score: %d' % (name, n)
x = 'name: {}; score: {}'.format(name, n)
No: x = imperative + ', ' + expletive + '!'
x = 'name: ' + name + '; score: ' + str(n)
由于字符串是不可變的, 這樣做會創建不必要的臨時對象, 并且導致二次方而不是線性的運行時間. 作為替代方案, 你可以將每個子串加入列表, 然后在循環結束后用 .join 連接列表. (也可以將每個子串寫入一個 cStringIO.StringIO 緩存中.)
Yes: items = ['<table>']
for last_name, first_name in employee_list:
items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
items.append('</table>')
employee_table = ''.join(items)
No: employee_table = '<table>'
for last_name, first_name in employee_list:
employee_table += '<tr><td>%s, %s</td></tr>' % (last_name, first_name)
employee_table += '</table>'
無關效率但是提高代碼可讀性的
空格
不要在逗號, 分號, 冒號前面加空格, 但應該在它們后面加(除了在行尾). 為了美觀以及IDE的規范提示
Yes: if x == 4:
print x, y
x, y = y, x
No: if x == 4 :
print x , y
x , y = y , x
在二元操作符兩邊都加上一個空格, 比如賦值(=), 比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布爾(and, or, not). 至于算術操作符兩邊的空格該如何使用, 需要你自己好好判斷. 不過兩側務必要保持一致.
分號
不要在行尾加分號, 也不要用分號將兩條命令放在同一行.
行長度
每行不超過80個字符
例外: 長的導入模塊語句,注釋里的URL
括號
對括號進行最佳精簡化,能少則少
空行
頂級定義之間空兩行, 方法定義之間空一行
正文之后
搞掂 走起,后期看看效果哈