您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python編碼規范知識點實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python編碼規范知識點實例分析”吧!
一般來說,聲明編碼格式在腳本中是必需的。
國際慣例,文件編碼和 Python 編碼格式全部為 utf-8 。例如:在 Python 代碼的開頭,要統?加上如下代碼:
# -- coding: utf-8 --
如果Python源碼文件沒有聲明編碼格式,Python解釋器會默認使用ASCII編碼。但出現非ASCII編碼的字符,Python解釋器就會報錯,因此非 ASCII 字符的字符串,請需添加u前綴。
若出現 Python編碼問題,可按照以下操作嘗試解決:
import sys reload(sys) sys.setdefaultencoding('utf-8')
不要在行尾加分號,也不要用分號將兩條命令放在同一行。
每行不超過80個字符
以下情況除外:
長的導入模塊語句
注釋里的URL
不要使用反斜杠連接行。
Python會將 圓括號, 中括號和花括號中的行隱式的連接起來 。
圓括號、方括號或花括號以內的表達式允許分成多個物理行,無需使用反斜杠。例如:
month_names = ['Januari', 'Februari', 'Maart', # These are the 'April', 'Mei', 'Juni', # Dutch names 'Juli', 'Augustus', 'September', # for the months 'Oktober', 'November', 'December'] # of the year
隱式的行拼接可以帶有注釋。后續行的縮進不影響程序結構。后續行也允許為空白行。
如果需要,可以在表達式外圍增加一對額外的圓括號。
如果一個文本字符串在一行放不下, 可以使用圓括號來實現隱式行連接
x = ('這是一個非常長非常長非常長非常長 ' '非常長非常長非常長非常長非常長非常長的字符串')
Python 采用代碼縮進和冒號( : )來區分代碼塊之間的層次。
在 Python 中,對于類定義、函數定義、流程控制語句、異常處理語句等,行尾的冒號和下一行的縮進,表示下一個代碼塊的開始,而縮進的結束則表示此代碼塊的結束。
Python 中實現對代碼的縮進,可以使用空格或者 Tab 鍵實現。但無論是手動敲空格,還是使用 Tab 鍵,通常情況下都是采用 4 個空格長度作為一個縮進量(默認情況下,一個 Tab 鍵就表示 4 個空格)。
對于 Python 縮進規則,初學者可以這樣理解,Python 要求屬于同一作用域中的各行代碼,它們的縮進量必須一致,但具體縮進量為多少,并不做硬性規定。
建議使用 Emacs 的 Python-mode 默認值:4 個空格一個縮進層次。不要用tab,也不要tab和空格混用
正確示例代碼:
if a==0: print("正確") # 縮進4個空白占位 else: # 與if對齊 print("錯誤") # 縮進4個空白占位 或者 # 4 個空格縮進,第一行不需要 foo = long_function_name( var_one, var_two, var_three, var_four)
錯誤示例代碼:
if a==0: print("正確") else: print("錯誤") print("end") # 錯誤的是這行代碼前面加了一個空格 或者 # 2 個空格是禁止的 foo = long_function_name( var_one, var_two, var_three, var_four)
Python中使用 # 進行注釋,# 號后面要空一格。
最需要寫注釋的是代碼中那些技巧性的部分:對于復雜的操作,應該在其操作開始前寫上若干行注釋.;對于不是一目了然的代碼,應在其行尾添加注釋。
為了提高可讀性,注釋和代碼隔開一定的距離,注釋應該至少離開代碼2個空格,塊注釋后面最好多留幾行空白再寫代碼。
當代碼更改時,優先更新對應的注釋。
如果一個注釋是一個短語或者句子,它的第一個單詞應該大寫,除非它是以小寫字母開頭的標識符(永遠不要改變標識符的大小寫!)。
如果注釋很短,結尾的句號可以省略。塊注釋一般由完整句子的一個或多個段落組成,并且每句話結束有個句號。
在句尾結束的時候應該使用兩個空格。
Python中有三種形式的注釋:行注釋、塊注釋、文檔注釋
行注釋:注釋應解釋自己做了什么,而不是對代碼本身的解釋
有節制地使用行內注釋
行內注釋是與代碼語句同行的注釋
行內注釋和代碼至少要有兩個空格分隔
注釋由#和一個空格開始。
n = input() m = input() t = n / 2 # t是n的一半 # 循環,條件為t*m/n 小于n while (t * m / (n + 1) < n): t = 0.5 * m + n / 2 # 重新計算t值 print(t)
塊注釋:
塊注釋通常適用于跟隨它們的某些(或全部)代碼,并縮進到與代碼相同的級別
塊注釋的每一行開頭使用一個 # 和一個空格(除非塊注釋內部縮進文本)。
塊注釋內部的段落通常只有一個 # 的空行分隔。
def FuncName(parameter1,parameter2): """ 描述函數要做的事情 :param parameter1: 參數一描述(類型、用途等) :param parameter2: 參數二描述 :return: 返回值描述 """
# We use a weighted dictionary search to find out where i is in # the array. We extrapolate position based on the largest num # in the array and the array size and then do binary search to # get the exact number. if i & (i-1) == 0: # true if i is a power of 2
文檔注釋:
要為所有的公共模塊,函數,類和方法編寫文檔說明
非公共的方法沒有必要,但是應該有一個描述方法具體作用的注釋。這個注釋應該在def那一行之后
多行文檔注釋使用的結尾三引號應該是自成一行
class SampleClass(object): """Summary of class here. Longer class information.... Longer class information.... Attributes: likes_spam: A boolean indicating if we like SPAM or not. eggs: An integer count of the eggs we have laid. """ def __init__(self, likes_spam=False): """Inits SampleClass with blah.""" self.likes_spam = likes_spam self.eggs = 0 def public_method(self): """Performs operation blah."""
頂層函數和類定義,前后用兩個空行隔開
編碼格式聲明、模塊導入、常量和全局變量聲明、頂級定義和執行代碼之間空兩行
類里面方法定義用一個空行隔開
在函數或方法內部,可以在必要的地方空一行以增強節奏感,但應避免連續空行
class Class01: pass class Class02: def function_01(self): pass def function_02(self): pass
使用必要的空行可以增加代碼的可讀性,通常在頂級定義(如函數或類的定義)之間空兩行,而方法定義之間空一行,另外在用于分隔某些功能的位置也可以空一行。
不要混用制表符和空格,因為如果混用了,雖然在編輯環境中顯示兩條語句為同一縮進層次,但因為制表符和空格的不同會導致 Python 解釋為兩個不同的層次。
在調用 Python 命令行解釋器時使用 -t 選項,可對代碼中不合法的混合制表符和空格發出警告,使用 -tt 時警告將變成錯誤,這些選項是被高度推薦的。但是強烈推薦僅使用空格而不是制表符。
空格使用規則:
在二元運算符兩邊各空一格,比如賦值(=)、比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布爾(and, or, not),算術操作符兩邊的空格可靈活使用,但兩側務必要保持一致
不要在逗號、分號、冒號前面加空格,但應該在它們后面加(除非在行尾)
函數的參數列表中,逗號之后要有空格
函數的參數列表中,默認值等號兩邊不要添加空格
左括號之后,右括號之前不要加添加空格
參數列表, 索引或切片的左括號前不應加空格
當'='用于指示關鍵字參數或默認參數值時,不要在其兩側使用空格
正確示例代碼:
spam(ham[1], {eggs: 2}, []) if x == 4: print x, y x, y = y, x dict['key'] = list[index] def complex(real, imag=0.0): return magic(r=real, i=imag)
錯誤示例代碼:
spam( ham[ 1 ] , { eggs: 2 } , [ ] ) if x == 4 : print x , y x , y = y , x dict ['key'] = list [index] def complex(real, imag = 0.0): return magic(r = real, i = imag)
模塊名命名
模塊盡量使用小寫命名,首字母保持小寫,盡量不要用下劃線(除非多個單詞,且數量不多的情況)
# 正確 import decoder import html_parser # 不推薦 import Decoder
變量命名
不要使用字母I (小寫的L), O (大寫的O), I (大寫的I)作為單字符的變量名。在有些字體里面,這些字符無法與數字0和1區分。如果想用I, 可使用L代替。
變量名盡量小寫, 如有多個單詞,用下劃線隔開。
count = 0 this_is_var = 0
常量或者全局變量命名
全部大寫,如有多個單詞,用下劃線隔開
全?寫+下劃線式駝峰
MAX_CLIENT = 100
函數命名
函數名應該小寫,如有多個單詞,用下劃線隔開。
大小寫混合僅在為了兼容原來主要以大小寫混合風格的情況下使用,保持向后兼容。
私有函數在函數前加一個下劃線_。
def run(): pass def run_with_env(): pass class Person(): def _private_func(): pass
類命名
類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭。
在接口被文檔化并且主要被用于調用的情況下,可以使用函數的命名風格代替。
對于內置的變量命名有一個單獨的約定:大部分內置變量是單個單詞(或者兩個單詞連接在一起),首字母大寫的命名法只用于異常名或者內部的常量。
class Farm(): pass class AnimalFarm(Farm): pass class _PrivateFarm(Farm): pass
類里面函數和方法參數
始終要將self作為實例方法的第一個參數。
始終要將cls作為類方法的第一個參數。
如果函數的參數名和已有關鍵字沖突,在最后加大意下劃線比縮寫或者隨意拼寫更好。因此class_比clss更好。
特別注意:
不要中英文混編
不要有a、b、c這種沒有意義的命名
不要怕名字長就隨便縮寫,比如person_info 縮寫成pi
不要用大小寫區分變量類型,比如a是int類型,A是String類型
不要使用容易引起混淆的變量名
bool變量?般加上前綴 is_ 如:is_success
變量名不要用系統關鍵字,如 dir type str等等
以下用下畫線作前導或結尾的特殊形式是被公認的:
_single_leading_underscore(以一個下畫線作前導):例如,“from M import *”不會導入以下畫線開頭的對象。
single_trailing_underscore_(以一個下畫線結尾):用于避免與 Python 關鍵詞的沖突,例如“Tkinter.Toplevel(master, class_='ClassName')”。
__double_leading_underscore (雙下畫線):從 Python 1.4 起為類私有名。
__double_leading_and_trailing_underscore__:特殊的(magic) 對象或屬性,存在于
用戶控制的(user-controlled)名字空間,例如:__init__、__import__ 或 __file__。
自然語言使用雙引號
機器標識使用單引號
正則表達式使用雙引號
文檔字符串 (docstring) 使用三個雙引號
字符串引號規則:
單引號和雙引號字符串是相同的。當一個字符串中包含單引號或者雙引號字符串的時候,使用和最外層不同的符號來避免使用反斜杠,從而提高可讀性。
在同一個文件中,保持使用字符串引號的一致性。在字符串內可以使用另外一種引號,以避免在字符串中使用。
正確使用示例:
Tim('Why are you hiding your eyes?') Bob("I'm scared of lint errors.") Juy('"Good!" thought a happy Python reviewer.')
當且僅當代碼中使用單引號'來引用字符串時,才可能會使用三重'''為非文檔字符串的多行字符串來標識引用
文檔字符串必須使用三重雙引號"""
導入應該放在文件頂部,位于模塊注釋和文檔字符串之后,模塊全局變量和常量之前。
導入應該按照從最通用到最不通用的順序分組:標準庫導入、第三方庫導入、應用程序指定導入,分組之間空一行。
模塊名稱要短,使用小寫,并避免使用特殊符號, 比如點和問號。
盡量保持模塊名簡單,以無需分開單詞最佳(不推薦在兩個單詞之間使用下劃線)。
每個導入應該獨占一行。
正確使用例子:
import os import numpy import sys from types import StringType, ListType
錯誤使用例子:
import os, numpy, sys
從一個包含類的模塊中導入類時,通常可以寫成這樣:
from MyClass import MyClass from foo.bar.YourClass import YourClass
模塊導入建議
示例 | 評價 |
from modu import * | 差, 不清楚具體從模塊中導入了哪些內容 |
from modu import sqrt | 稍好 |
import modu import modu.sqrt | 最佳 , 調用的時候直接使用modu.sqrt能比較清楚的知道當前方法屬于哪個模塊 |
import os import sys | 推薦 |
import os, sys | 不推薦 |
from subprocess import Popen, PIPE | 推薦 |
主功能應該放在一個main()函數中。
在Python中,pydoc以及單元測試要求模塊必須是可導入的。代碼應該在執行主程序前總是檢查 if __name__ == '__main__'
, 這樣當模塊被導入時主程序就不會被執行。
def main(): ... if __name__ == '__main__': main()
函數設計的主要目標就是最大化代碼重用和最小化代碼冗余。精心設計的函數不僅可以提高程序的健壯性,還可以增強可讀性、減少維護成本。
函數設計要盡量短小,嵌套層次不宜過深。 所謂短小, 就是盡量避免過長函數, 因為這樣不需要上下拉動滾動條就能獲得整體感觀, 而不是來回翻動屏幕去尋找某個變量或者某條邏輯判斷等。 函數中需要用到 if、 elif、 while 、 for 等循環語句的地方,盡量不要嵌套過深,最好能控制在3層以內。不然有時候為了弄清楚哪段代碼屬于內部嵌套, 哪段屬于中間層次的嵌套, 哪段屬于更外一層的嵌套所花費的時間比讀代碼細節所用時間更多。
盡可能通過參數接受輸入,以及通過return產生輸出以保證函數的獨立性。
盡量減少使用全局變量進行函數間通信。
不要在函數中直接修改可變類型的參數。
函數申明應該做到合理、 簡單、 易于使用。 除了函數名能夠正確反映其大體功能外, 參數的設計也應該簡潔明了, 參數個數不宜太多。 參數太多帶來的弊端是: 調用者需要花費更多的時間去理解每個參數的意思,測試的時候測試用例編寫的難度也會加大。
函數參數設計應該考慮向下兼容。
如果要將 RCS 或 CVS 的雜項包含在你的源文件中,按如下格式操作:
__version__ = "$Revision: 1.4 $" # $Source: E:/cvsroot/python_doc/pep8.txt,v $
對于 CVS 的服務器工作標記更應該在代碼段中明確出它的使用說明,如在文檔最開始的版權聲明后應加入如下版本標記:
# 文件:$id$ # 版本:$Revision$
這樣的標記在提交給配置管理服務器后,會自動適配成為相應的字符串,如:
# 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $ # 版本:$Revision: 1.4 $
這些應該包含在模塊的文檔字符串之后,所有代碼之前,上下用一個空行分割。
感謝各位的閱讀,以上就是“Python編碼規范知識點實例分析”的內容了,經過本文的學習后,相信大家對Python編碼規范知識點實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。