一、代碼規范的意義
代碼規范,這詞可能在很多人感覺是熟悉又陌生,
熟悉的是,好像經常能在網上博文里看到這樣的字眼,陌生的是自己在擼代碼的時候好像沒怎么思考過這個問題,
我雖在寫代碼的時候會帶著注意規范,但也不是完全謹遵規范來的,因為我也不知道到底有多少規范,哈哈,
話雖如此,代碼規范的重要性還是非常大的,不然阿里這樣的也就不用出個手冊來規范員工的代碼了,
那為什么要去強調代碼規范呢?
我覺得最大的意義是易于閱讀,不光是別人閱讀,過段時間你自己看自己代碼的時候,也不至于要想上半天,
其實仔細想想,咱們的日常編碼作業中,閱讀代碼的時間應該是多于敲代碼的時間的,
很多時候,我們指尖飛舞,一頓操作猛如虎,結果運行就出問題了,然后一行行的開始debug半天,如果你的
代碼閱讀性差,估計你自己都看不下去了吧,(別問我是怎么知道的)

二、pycharm中的輔助提示
得益于現在代碼編輯器的強大,在pycharm中就可以設定規范幫你檢查代碼,

這里的PEP 是 Python Enhancement Proposal 的縮寫,翻譯過來叫“Python 增強規范”,當它檢測到有不符合規范
的代碼是就會給出建議提示,我覺得越是新手,越早點了解并且盡量遵循規范是最好的,因為你規范的敲代碼并不會比
你亂敲慢太多,從新手就養成好習慣,可比你以后再改過來容易多了,
成,那么在python里,又有哪些規范是需要我們在意的呢?
三、常用規范
1、縮進:
- 使用四空格縮進,不要使用tab,也不要混合著使用,
- 每行最大長度盡量控制79個字符內,不然單行太長也不利于閱讀,
此外,當你寫嵌套代碼的時候,如果層數多了,很容易就超過這個長度限制了,其實也變相提醒著我們,
代碼不要迭代的太深入,要善于拆分代碼來優化代碼結構,
2、空格:
- 函式的引數之間要有一個空格,跟寫英語一樣,不然擠在一起多鬧心,
- 字典的冒號之后要有一個空格
- 串列、元組、字典的元素之間要有一個空格
- 使用#注釋的話,#后要有一個空格
- 運算子(比如+,-,*,/,&,|,=,==,!=)兩邊都要有一個空格,不過括號(包括小括號、中括號和大括號)內的兩端不需要空格
3、空行:
- 全域的(檔案級別的)類和全域的函式上方要有兩個空行
- 類中的函式上方要有一個空行
- 函式內部不同意義的代碼塊之間可以有一個空行
- 不要把多行陳述句合并為一行(即不要使用分號分隔多條陳述句)
- 當使用控制陳述句if/while/for時,即使執行陳述句只有一行命令,也需要另起一行
- 代碼檔案尾部有且只有一個空行,不要敲多
4、換行:
- 通過小括號進行封裝,此時雖然跨行,但是仍處于一個邏輯參考之下,比如函式引數串列的場景、過長的運算陳述句場景
def fit(self,
x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
**kwargs):
- 直接通過換行符()實作
5、導包:
- 所有import盡量放在代碼檔案的頭部位置
- 每行import只匯入一個物件
- 當使用from xx import xx時,import后面跟著的物件要是一個package(包對應代碼目錄)或者module(模塊對應代碼檔案),不要是一個類或者一個函式
6、注釋:
- 對于代碼塊注釋,在代碼塊上一行的相同縮進處以 # 開始書寫注釋
- 代碼行注釋,在代碼行的尾部跟2個空格,然后以 # 開始書寫注釋,行注釋盡量少寫
# 對于代碼塊注釋,在代碼塊上一行的相同縮進處以 # 開始書寫注釋
# 文字多就多寫幾行,當文章一樣,一定要注意邏輯別寫錯
def solve(x):
if x == 1: # 單行注釋在尾部跟2個空格,然后以 # 開始書寫注釋,行注釋盡量少寫
return False
return True
- 如果寫英文注釋開頭要大寫,結尾要寫標點符號,避免語法錯誤和邏輯錯誤,
- 改動代碼邏輯時,一定要及時更新相關的注釋
7、檔案描述:
格式:三個雙引號開始、三個雙引號結尾;
注意點:首先用一句話簡單說明這個函式做什么,然后跟一段話來詳細解釋;
再往后是引數串列、引數格式、回傳值格式的描述,
# 參考下requests庫中post方法的描述
def post(url, data=https://www.cnblogs.com/pingguo-softwaretesting/p/None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=https://www.cnblogs.com/pingguo-softwaretesting/p/data, json=json, **kwargs)
8、命名:
- 變數名,要全部小寫,多個詞通過下劃線連接,比如
data_format - 有時候可以使用單字符變數名,比如
for i in range(n)這種變數沒有實際意義的情況 - 類的私有變數名,變數名前需要加2個下劃線,比如
__description__ - 常量名,要全部大寫,多個詞通過下劃線連接,比如
WAIT_TIME - 函式名,要全部小寫,多個詞通過下劃線連接,比如
check_input_validation() - 類名,要求駝峰形式,即單詞首字母大寫,多個詞的話,每個詞首字母大寫然后直接拼接,比如
class FeatureSet() - 命名需要做到名如其意,不要過于吝嗇名字的長度,比如
test_allot_list_query_by_status(),通過狀態查詢串列
9、注意代碼分解:
- 不寫重復代碼,重復代碼可以通過使用條件、回圈、函式和類來解決
- 減少迭代層數,讓代碼扁平化
- 函式拆分,函式的粒度盡可能細,也就是一個函式不要做太多事情
- 類的拆分,如果一個類中有多個屬性描述的是同一類事物,就可以把這些屬性拆分出來新建一個單獨的類
- 模塊化,若專案偏大,要為不同功能模塊創建獨立的目錄或檔案,通過import互相關聯
四、寫在最后
上面列的雖然比較多,但是也別害怕,仔細理解下,上述這些規范最終目的就是一個:提高代碼閱讀性,你寫代碼的時候也帶點心
就好了,畢竟沒有什么事情是絕對的,萬事都有個度在里面,自己權衡好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271852.html
標籤:其他
