最近一直在強調代碼規范,但是有很多朋友不太清楚,我到底要怎么抒寫代碼,才算是規范呢?
所以,老Amy就在考慮,好記性不如爛筆頭,反復強調不如一篇文章反復查閱,hhhh~
那什么是代碼規范呢?代碼規范也就是指在撰寫代碼時,我們需要去遵循一些通用的撰寫方式或撰寫風格,注意,并不做強制性(也就是說不按規范寫并不會報錯),但是卻是《程式員自我修養》的必學之技,開始肝!
那今天主要來聊聊 Python 編碼風格指南——PEP 8
PEP8介紹
PEP 8 的英文全稱為 Style Guide for Python Code ,即 Python 編碼風格規范,主要涵蓋三個大的方面
- 命名規范
- 注釋檔案
- 代碼布局
命令規范
命名規范是我們一直在強調的,那實際上它是一個非常具有擴展性的話題,我們需要了解 主要的命令規則 以及 python 中針對 不同元素 的常用命名方式,
常見命名規則
- 小駝峰命名法:以一至多個邏輯單元構成,每個邏輯單元都可稱為一個識別字,每個識別字首字母小寫,其余識別字首字母大寫,比如:
oldKing - 大駝峰命名法:與小駝峰命名法類似,區別為首字母大寫,比如
OldKing - 下劃線命名法:和駝峰命名法類似,區別為所有識別字均小寫,識別字之間使用
_連接,比如old_king
除此之外,還有其他形式的命名規則,比如大寫 OLDKING、大寫結合下劃線OLD_KING、小寫 oldking 等,另外在 Python 中也有 前綴 或者 后綴 下劃線、雙下劃線等命名方式,
Python 常用的命名方式
對于變數與常量:
- 變數名 可 小寫,也可使用 下劃線命名;
- 常量 應使用 全大寫字母,必要時使用 下劃線分隔,并且要注意在 Python 中并沒有類似其他語言中
const的概念,常量 僅僅是一種 約定(常量通常放置在代碼頂部、或單獨的模塊、或特定的組態檔中), - 對于 容器類變數 ,常采用 復數 名詞形式;對于 映射類變數 ,常采用
key_value的形式,其中key、value為鍵和值的實際含義,比如:information_value = {"name":"amy","age":18} - 對于表示 布林值 的變數或者常量(但不僅限于這兩者),常采用
has、is作為前綴,
對于類(和例外):
- 類名 應使用 大駝峰命名(這里不包括一些 Python 內置的類,比如
int、list),類和屬性常采用名詞,方法多采用動詞或者包含動詞, - 基類 常采用
Base作為前綴,抽象類 常采用Abstract作為前綴, - 例外名 應使用 大駝峰命名法,當此例外表示一個錯誤時,應添加
Error后綴(并不是所有例外都代表代碼運行錯誤,比如 KeyboardInterrupt、SystemExit ),
對于函式、方法:
- 函式名、方法 名應使用 小寫,也可使用 下劃線命名(但我們仍會在一些代碼中看到一些方法或者函式名稱采用了駝峰命名法,甚至在 Python 的標準庫中也存在這樣的現象,比如在 threading 模塊中,因為這些代碼的出現往往早于 PEP 8 規范的誕生,同時為了向后兼容而保留,但通常這些模塊都會提供相同功能的以小寫加下劃線命名的方法,我們應該盡可能使用這些新的方法),
- 實體方法 的首個引數名應為
self,類方法的首個引數應為cls(class作為關鍵字不能被使用,常被cls或klass替換);
對于模塊和包:
- 模塊( modules ) 名應盡可能使用 小寫,在必要時可以使用下劃線命名(除了
__init__模塊以外) - 包( packages ) 名應使用 小寫,最好不要使用下劃線;
特殊格式:
- 單下劃線前綴,比如
_name,常稱為 ”偽私有屬性“(也可用于私有的方法、類等),這種命名方式在 Python 中是一種表示私有屬性的約定(同時注意from ... import *時不會匯入這種形式的物件,并且這種偽私有變數通常會通過特定的方法來獲取或者賦值),私有屬性通常沒有直接對外的功能,常用于記錄內部狀態或用于提供一些公共功能的方法內使用; - 單下劃線后綴,比如
name_,常用于 避免 和 Python 的 關鍵字 發生沖突; - 雙下劃線前綴,比如
__name,常用于 基類避免 和 子類中的命名沖突,Python 會通過轉換規則將其轉換為類似_Class__name的形式,這種方式通常稱為命名修飾name mangling或name decoration(這種方式通常用于多繼承,應避免將這種形式用在私有屬性的命名上);
>>> class MyClass:
... __name = 1
...
>>> MyClass.__name # 無法直接訪問
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: type object 'MyClass' has no attribute '__name'
>>> MyClass._MyClass__name
1
- 前后雙下劃線,比如
__name__,這是我們之前提到過的 Python 內部常用的 dunder 名稱,不應自定義這類命名,
注釋撰寫
注釋對于代碼的閱讀、擴展以及維護都非常重要,在 Python 中常用的注釋方式有三種,分別為塊注釋( Block Comments )、行內注釋( Inline Comments )、檔案字串( Documentation Strings ),
塊注釋( Block Comments )
- 塊注釋 在代碼內部比較常見,其通常由一至多個段落構成,段落之間應使用開頭為
#的空行隔開,每個段落由完整的句子構成,在每行以#和一個空格開始,另外,塊注釋和被注釋代碼之間應具有同級別的縮進,這樣有助于區分注釋和代碼之間關聯關系,如下代碼體現出塊注釋:
@classmethod
def fromkeys(cls, iterable, v=None):
# There is no equivalent method for counters because the semantics
# would be ambiguous in cases such as Counter.fromkeys('aaabbc', v=2).
# Initializing counters to zero values isn't necessary because zero
# is already the default value for counter lookups. Initializing
# to one is easily accomplished with Counter(set(iterable)). For
# more exotic cases, create a dictionary first using a dictionary
# comprehension or dict.fromkeys().
raise NotImplementedError(
'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
行內注釋( Inline Comments )
- 行內注釋 是一種形式相對簡單的注釋,它和運算式或陳述句位于同一行,之間應通常使用兩個空格隔開,注釋部分應以
#和一個空格開始,
one_list = [] # 創建串列
檔案字串( Documentation Strings )
-
在 Python 中,最重要的注釋形式便是 檔案字串,主要用于兩方面:
- 用來對模塊、類、函式、方法等進行說明;
- 可以配合一些輔助工具來自動化生成代碼檔案
-
當然大家現在可能很難體會到檔案字串的重要性,但是提到開源這個詞,我們就會知道,一個開源檔案的質量取決于它的可讀性,而可讀性往往伴隨著大量的說明檔案,
def function_name():
"""docstrings"""
pass
代碼布局
縮進與空格
Python 在語法上使用 縮進 來確定代碼塊的開始和結束,對于每一級縮進,都應該是 4個空格,當然,在 Pycharm 當中,我們可以設定使用 tab 鍵來進行縮進,
那需要注意,縮進本身是 強制性的,但是空格數量實際上語法并沒有做限制,只不過同級代碼縮進空格一致即可,
當然,一般我們都是以 4個空格 來進行使用,
# 4個空格表示縮進
def function_name():
"""docstrings"""
pass
# 8個空格表示縮進
def function_name_two():
"""docstrings"""
pass
代碼之間的空行
函式與類之間應該使用兩個空行隔開,而類的內部的方法之間應該使用一個空行隔開,函式或方法中不同功能的代碼塊可使用空行隔開,
觀察以下代碼空行規則:
class MyClass(object):
def method_one(self):
pass
def method_two(self):
pass
def function_name():
"""docstrings"""
pass
def function_name_two():
"""docstrings"""
pass
奧啦~常用的我們就講解到此,大家在寫代碼的時候一定要注意代碼規范奧!這樣才會增加我們代碼的可讀性,顯得更加專業,如果認真的看到這里,給自己一個666叭
想學習更多關于python的文章,歡迎專注我們的公眾號奧~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240065.html
標籤:python
上一篇:亂數函式
