1.編碼
- 如無特殊情況,文件一律使用utf-8編碼
- 如無特殊情況,文件頭部必須添加# -*- coding:utf-8 -*- 標志
2.代碼
- 統一使用四個空格縮進
- 每行代碼不超過80個字符
- 自然語言使用雙引號,如input里面,或者錯誤信息,正則表達式使用原生的雙引號r" ",
- 機器標識使用單引號,如dict里面的key,因此代碼里面多數應該使用單引號。
- 文檔字符串使用三個雙引號。""" """
3.空行
- 模塊級函數和類定義之間空兩行
- 類成員函數之間空一行
- 可以使用多個空行分隔多組相關函數
- 函數中可以用空行分隔出邏輯相關的代碼
class A: def __init__(self): pass def hello(self): pass def main(): pass
4.import語句
- import 語句應當分行書寫
- import語句應當使用absolute import
- import語句應當放在文件頭部,置於模塊說明及docstring之后,全局變量之前
- import語句應該按照順序排列,每組之間用一個空格分隔,按照內置模塊,第三方模塊,自己所寫的模塊調用順序,同時每組內部按照字母表順序排列
#Right import os import sys from subprocess import Popen, PIPE from foo.bar import Bar #False import os, sys from ..bar import Bar
5.空格
在二元運算符兩邊各空一格:[=, - ,+ =, > , in , is ,not , and]
i = i + 1 x = x * x + 2 c = (a + b) * (a - b)
函數的參數列表中,","之后要有空格,默認值等號兩邊不要添加空格,左括號之后,右括號之前不要有空格
def complex(real, image=0): pass
6.換行
python支持括號內的換行,這時有兩種情況:
1.第二行縮進到括號的起始處
2.第二行縮進四個空格,適用於起始括號就換行的情形
a = list(var1, var2, var3) a=list( var1, var2, var3)
7.注釋
#號后需空一格,不要使用無意義的注釋
x = x + 1 # 邊框加粗一個像素
8.docstring
1.所有公共模塊,函數,類,方法都應該有docstring。
9.命名規范
- 應避免使用小寫字母l,大寫字母O或I單獨作為一個變量,以區分數字1和0.
- 包和模塊使用全小寫命名,,盡量不要使用下划線
- 類名使用CamelClass命名風格,內部類可用一個下划線開頭
- 函數使用下划線分隔的小寫命名
- 常量使用以下划線分隔的大寫命名
MAX_OVERFLOW = 100 class FooBar: def foo_bar(): pass
- 單字符命名應該盡量避免,除了計數器和迭代器
- 模塊名盡量小寫命名,首字母小寫,盡量不要使用下划線(除非多個單詞且數量不多的情況)
- 類名:首字母大寫,私有類可以用一個下划線開頭
- 將相關的類和頂級函數放在同一個模塊中,沒必要限制一個類一個模塊
- 函數名:一律小寫,如有多個單詞一律用下划線隔開
- 私有函數在函數名前加一個下划線
- 變量名盡量小寫,如有多個單詞,用下划線隔開
- 常量采用全大寫,如有多個單詞,使用下划線隔開
#False s = "Hello World" l = 1 import Decoder #True class Farm(): class Animal(): class _PrivateFarm(): def run(): count = 0 school_name = "xidian" MAX_CLIENT = 100
10.程序設計規范
1.盡量不要直接將代碼寫在模塊頂層,在執行主程序之前總是檢查:if __name__ = '__main__',這樣模塊被導入主程序時就不會被執行了
#wrong do_something() #right def main(): do_something(): if __name__ == '__main__': main()
所有的頂層代碼在模塊導入時都會被執行,要小心不要去調用函數,創建對象,或者執行哪些不該被執行的操作
盡量不要用+號拼接字符串,使用join函數拼接
在不復雜的情況下,盡量多用列表生成式,可以是代碼更清晰
盡量使用map和filter等內置函數而不是自己去寫循環
正則表達式之前一律加r,正則表達式使用之前一律編譯好。