代碼除了用來運行外,更多的是用來讀。爲了是代碼的可讀性更強,不少編程語言都有本身的編碼規範。規範的制定是爲了保持代碼的一致性,以使代碼更美觀和易讀。代碼應該怎麼樣排版和編寫並非絕對的,因此一些地方會有爭議。有時風格指南並不適用,最重要的知道什麼時候不一致。當你沒法判斷該怎麼作時,應該所參考下其餘的例子。html
本文僅是一個 Python 編碼風格的參考,並非一個規定,規定必需要這麼去作。本文的目的應該是起一個指導做用,指導開發者去寫更易讀的代碼。python
主要是縮進與空行的排版:程序員
主要是整個源碼文件的佈局:算法
import os, sys
不推薦。from xx import xx
,儘可能避免使用 from xx imoprt *
。from xx import *
時,應該在導入語句後或者模塊尾使用 __all__
機制來限制導入規則。if foo: bar(foo)
.class UnfoundError(Exception): pass
.# 一行寫不下時,有括號來鏈接多行,後續行應該使用懸掛縮進 if (this_is_one_thing and that_is_another_thing): do_something() # 函數調用參數較多時,對準左括號 f = foo(a, b, c, d) # 不對準左括號,但加多一層縮進,以和後面內容區別 def long_function_name( a, b, c, d, e): print(a, b, c, d, e) # 列表、元組、字典以及函數調用時可讓右括號回退,這樣更加美觀 l = [ 1, 2, 3, 4, 5, 6, ] result = some_function( 'a', 'b', 'c', 'd', 'e', 'f', )
整體原則,避免沒必要要的空格。編程
良好的風格:session
spam(ham[1], {eggs: 2}) if x == 4: print x, y; x, y = y, x f = foo(1, 2, 3) ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] x = 1 y = 2 long_variable = 3 def foo(a, b, c=0): return moo(m=a, n=b, o=c)
很差的風格:數據結構
spam( ham[ 1 ], { eggs: 2 } ) if x == 4 : print x , y ; x , y = y , x f = foo (1, 2, 3) ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper] x = 1 y = 2 long_variable = 3 def foo(a, b, c = 0): return moo(m = a, n = b, o = c)
整體原則,錯誤的註釋不如沒有註釋。因此當一段代碼發生變化時,第一件事就是要修改註釋。註釋儘可能使用英文,最好是完整的句子,首字母大寫,句後要有結束符,結束符後跟兩個空格,開始下一句。若是是短語,能夠省略結束符。註釋應該在 #
後加一個空格纔開始寫註釋內容。編程語言
# Description : Module config. # # Input : None # # Output : None
person = { "name": "huoty", # 姓名 "age": 26, # 年齡 "stature": 169, # 身高 "weight": 60, # 體重 } print person # 輸出信息
TODO
註釋來標記待完成的工做,團隊協做中,必要的時候應該寫上你的名字或者聯繫方式,好比:# TODO(sudohuoty@gmail.com): Use a "*" here for string repetition. # TODO(Huoty) Change this to use relations.
# 你可能會認爲你讀得懂如下的代碼。可是你不會懂的,相信我吧。 # 要是你嘗試玩弄這段代碼的話,你將會在無盡的通宵中不斷地咒罵本身爲何會認爲本身聰明到能夠優化這段代碼。 # so,如今請關閉這個文件去玩點別的吧。 # 程序員1(於2010年6月7日):在這個坑臨時加入一些調料 # 程序員2(於2011年5月22日):臨你個屁啊 # 程序員3(於2012年7月23日):樓上都是狗屎,鑑定完畢 # 程序員4(於2013年8月2日):fuck 樓上,三年了,這坑還在!!! # 程序員5(於2014年8月21日):哈哈哈,這坑竟然坑了這麼多人,幸虧我也不用填了,系統終止運行了,you're died
docstring
。"""Convert an API path to a filesystem path If given, root will be prepended to the path. root must be a filesystem path already. """
"""函數或方法的概述 詳細的描述信息…… 詳細的描述信息…… 參數說明 -------- 參數1:... 參數2:... 返回值: ... 異常: 異常1:... 異常2:... """
一個參考示例:編輯器
"""Start a kernel for a session and return its kernel_id. Parameters ---------- kernel_id : uuid The uuid to associate the new kernel with. If this is not None, this kernel will be persistent whenever it is requested. path : API path The API path (unicode, '/' delimited) for the cwd. Will be transformed to an OS path relative to root_dir. kernel_name : str The name identifying which kernel spec to launch. This is ignored if an existing kernel is returned, but it may be checked in the future. Return a kernel id """
"""這裏是類的概述。 詳細的描述信息…… 詳細的描述信息…… 屬性(Attributes): ----------------- 屬性1: ... 屬性2: ... """
Error
後綴的方式,好比:HTTPError。_foo
, _show_msg
來進行訪問控制。__a
, 則不能用 Foo.__a
的方式訪問,但能夠用 Foo._Foo__a
的方式訪問。`Python 屬於腳本語言,代碼的運行是經過解釋器對代碼文件進行逐行解釋執行來完成的。它不像其餘編程語言那樣有統一的入口程序,好比 Java 有 Main 方法,C/C++ 有 main 方法。Python 的代碼文件除了能夠被直接執行外,還能夠做爲模塊被其餘文件導入。全部的頂級代碼在模塊導入時都會被執行,當但願模塊被導入時,應該避免主程序被執行。這樣就須要把主程序放到 if __name__ == '__main__'
代碼塊中,好比:ide
def main(): ... if __name__ == '__main__': main()
一個包除了可以被導入外,也能夠經過 python -m package
的方式被直接執行,前提是包中須要有 __main__.py
,這個文件能夠說是包的程序入口,包中有了這個文件就能夠用 Python 的 -m
參數來直接運行。
Note: 等於比較運算符(==) 會調用左操做數的 __eq__
函數,這個函數能夠被其任意定義,而 is 操做只是作 id 比較,並不會被自定義。同時也能夠發現 is 函數是要快於等於運算符的,由於不用查找和運行函數。
# Yes: if isinstance(obj, int) # No: if type(obj) is type(1)
# Yes: if not seq if seq # No: if len(seq) if not len(seq)
while 1
比 while True
更快。**
比 pow
快 10 倍以上。