溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python編碼規(guī)范知識點實例分析

發(fā)布時間:2022-07-11 10:18:51 來源:億速云 閱讀:179 作者:iii 欄目:編程語言

這篇文章主要講解了“Python編碼規(guī)范知識點實例分析”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python編碼規(guī)范知識點實例分析”吧!

Python編碼規(guī)范知識點實例分析

1 代碼編碼格式

  • 一般來說,聲明編碼格式在腳本中是必需的。

  • 國際慣例,文件編碼和 Python 編碼格式全部為 utf-8 。例如:在 Python 代碼的開頭,要統(tǒng)?加上如下代碼:

# -- coding: utf-8 --
  • 如果Python源碼文件沒有聲明編碼格式,Python解釋器會默認使用ASCII編碼。但出現(xiàn)非ASCII編碼的字符,Python解釋器就會報錯,因此非 ASCII 字符的字符串,請需添加u前綴。

  • 若出現(xiàn) Python編碼問題,可按照以下操作嘗試解決:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

2 分號

不要在行尾加分號,也不要用分號將兩條命令放在同一行。

3 行的最大長度

每行不超過80個字符

以下情況除外:

  1. 長的導入模塊語句

  2. 注釋里的URL

不要使用反斜杠連接行。

Python會將 圓括號, 中括號和花括號中的行隱式的連接起來 。

圓括號、方括號或花括號以內(nèi)的表達式允許分成多個物理行,無需使用反斜杠。例如:

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ù)行的縮進不影響程序結(jié)構(gòu)。后續(xù)行也允許為空白行。

如果需要,可以在表達式外圍增加一對額外的圓括號。

如果一個文本字符串在一行放不下, 可以使用圓括號來實現(xiàn)隱式行連接

x = ('這是一個非常長非常長非常長非常長 '
     '非常長非常長非常長非常長非常長非常長的字符串')

4 縮進規(guī)則

  • Python 采用代碼縮進和冒號( : )來區(qū)分代碼塊之間的層次。

  • 在 Python 中,對于類定義、函數(shù)定義、流程控制語句、異常處理語句等,行尾的冒號和下一行的縮進,表示下一個代碼塊的開始,而縮進的結(jié)束則表示此代碼塊的結(jié)束。

  • Python 中實現(xiàn)對代碼的縮進,可以使用空格或者 Tab 鍵實現(xiàn)。但無論是手動敲空格,還是使用 Tab 鍵,通常情況下都是采用 4 個空格長度作為一個縮進量(默認情況下,一個 Tab 鍵就表示 4 個空格)。

  • 對于 Python 縮進規(guī)則,初學者可以這樣理解,Python 要求屬于同一作用域中的各行代碼,它們的縮進量必須一致,但具體縮進量為多少,并不做硬性規(guī)定。

建議使用 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)

5 注釋

  • Python中使用 # 進行注釋,# 號后面要空一格。

  • 最需要寫注釋的是代碼中那些技巧性的部分:對于復雜的操作,應該在其操作開始前寫上若干行注釋.;對于不是一目了然的代碼,應在其行尾添加注釋。

  • 為了提高可讀性,注釋和代碼隔開一定的距離,注釋應該至少離開代碼2個空格,塊注釋后面最好多留幾行空白再寫代碼。

  • 當代碼更改時,優(yōu)先更新對應的注釋。

  • 如果一個注釋是一個短語或者句子,它的第一個單詞應該大寫,除非它是以小寫字母開頭的標識符(永遠不要改變標識符的大小寫?。?。

  • 如果注釋很短,結(jié)尾的句號可以省略。塊注釋一般由完整句子的一個或多個段落組成,并且每句話結(jié)束有個句號。

  • 在句尾結(jié)束的時候應該使用兩個空格。

Python中有三種形式的注釋:行注釋、塊注釋、文檔注釋

行注釋:注釋應解釋自己做了什么,而不是對代碼本身的解釋

  • 有節(jié)制地使用行內(nèi)注釋

  • 行內(nèi)注釋是與代碼語句同行的注釋

  • 行內(nèi)注釋和代碼至少要有兩個空格分隔

  • 注釋由#和一個空格開始。

n = input()
m = input()
t = n / 2     # t是n的一半

# 循環(huán),條件為t*m/n 小于n
while (t * m / (n + 1) < n):
    t = 0.5 * m + n / 2     # 重新計算t值
print(t)

塊注釋

  • 塊注釋通常適用于跟隨它們的某些(或全部)代碼,并縮進到與代碼相同的級別

  • 塊注釋的每一行開頭使用一個 # 和一個空格(除非塊注釋內(nèi)部縮進文本)。

  • 塊注釋內(nèi)部的段落通常只有一個 # 的空行分隔。

def FuncName(parameter1,parameter2):

"""

描述函數(shù)要做的事情

:param parameter1: 參數(shù)一描述(類型、用途等)

:param parameter2: 參數(shù)二描述

: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

文檔注釋:

  • 要為所有的公共模塊,函數(shù),類和方法編寫文檔說明

  • 非公共的方法沒有必要,但是應該有一個描述方法具體作用的注釋。這個注釋應該在def那一行之后

  • 多行文檔注釋使用的結(jié)尾三引號應該是自成一行

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."""

6 空行

  • 頂層函數(shù)和類定義,前后用兩個空行隔開

  • 編碼格式聲明、模塊導入、常量和全局變量聲明、頂級定義和執(zhí)行代碼之間空兩行

  • 類里面方法定義用一個空行隔開

  • 在函數(shù)或方法內(nèi)部,可以在必要的地方空一行以增強節(jié)奏感,但應避免連續(xù)空行

class Class01:
    pass
 
 
class Class02:
    def function_01(self):
        pass
 
    def function_02(self):
        pass

使用必要的空行可以增加代碼的可讀性,通常在頂級定義(如函數(shù)或類的定義)之間空兩行,而方法定義之間空一行,另外在用于分隔某些功能的位置也可以空一行。

7 制表符還是空格

  • 不要混用制表符和空格,因為如果混用了,雖然在編輯環(huán)境中顯示兩條語句為同一縮進層次,但因為制表符和空格的不同會導致 Python 解釋為兩個不同的層次。

  • 在調(diào)用 Python 命令行解釋器時使用 -t 選項,可對代碼中不合法的混合制表符和空格發(fā)出警告,使用 -tt 時警告將變成錯誤,這些選項是被高度推薦的。但是強烈推薦僅使用空格而不是制表符。

空格使用規(guī)則:

  • 在二元運算符兩邊各空一格,比如賦值(=)、比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布爾(and, or, not),算術(shù)操作符兩邊的空格可靈活使用,但兩側(cè)務必要保持一致

  • 不要在逗號、分號、冒號前面加空格,但應該在它們后面加(除非在行尾)

  • 函數(shù)的參數(shù)列表中,逗號之后要有空格

  • 函數(shù)的參數(shù)列表中,默認值等號兩邊不要添加空格

  • 左括號之后,右括號之前不要加添加空格

  • 參數(shù)列表, 索引或切片的左括號前不應加空格

  • 當'='用于指示關(guān)鍵字參數(shù)或默認參數(shù)值時,不要在其兩側(cè)使用空格

正確示例代碼:

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)

8 命名規(guī)范

模塊名命名

  • 模塊盡量使用小寫命名,首字母保持小寫,盡量不要用下劃線(除非多個單詞,且數(shù)量不多的情況)

# 正確

import decoder

import html_parser

# 不推薦

import Decoder

變量命名

  • 不要使用字母I (小寫的L), O (大寫的O), I (大寫的I)作為單字符的變量名。在有些字體里面,這些字符無法與數(shù)字0和1區(qū)分。如果想用I, 可使用L代替。

  • 變量名盡量小寫, 如有多個單詞,用下劃線隔開。

count = 0
this_is_var = 0

常量或者全局變量命名

  • 全部大寫,如有多個單詞,用下劃線隔開

  • 全?寫+下劃線式駝峰

MAX_CLIENT = 100

函數(shù)命名

  • 函數(shù)名應該小寫,如有多個單詞,用下劃線隔開。

  • 大小寫混合僅在為了兼容原來主要以大小寫混合風格的情況下使用,保持向后兼容。

  • 私有函數(shù)在函數(shù)前加一個下劃線_

def run():
    pass

def run_with_env():
    pass


class Person():
    def _private_func():
        pass

類命名

  • 類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭。

  • 在接口被文檔化并且主要被用于調(diào)用的情況下,可以使用函數(shù)的命名風格代替。

  • 對于內(nèi)置的變量命名有一個單獨的約定:大部分內(nèi)置變量是單個單詞(或者兩個單詞連接在一起),首字母大寫的命名法只用于異常名或者內(nèi)部的常量。

class Farm():
    pass

class AnimalFarm(Farm):
    pass

class _PrivateFarm(Farm):
    pass

類里面函數(shù)和方法參數(shù)

  • 始終要將self作為實例方法的第一個參數(shù)。

  • 始終要將cls作為類方法的第一個參數(shù)。

  • 如果函數(shù)的參數(shù)名和已有關(guān)鍵字沖突,在最后加大意下劃線比縮寫或者隨意拼寫更好。因此class_比clss更好。

特別注意:

  • 不要中英文混編

  • 不要有a、b、c這種沒有意義的命名

  • 不要怕名字長就隨便縮寫,比如person_info 縮寫成pi

  • 不要用大小寫區(qū)分變量類型,比如a是int類型,A是String類型

  • 不要使用容易引起混淆的變量名

  • bool變量?般加上前綴 is_ 如:is_success

  • 變量名不要用系統(tǒng)關(guān)鍵字,如 dir type str等等

以下用下畫線作前導或結(jié)尾的特殊形式是被公認的:

  • _single_leading_underscore(以一個下畫線作前導):例如,“from M import *”不會導入以下畫線開頭的對象。

  • single_trailing_underscore_(以一個下畫線結(jié)尾):用于避免與 Python 關(guān)鍵詞的沖突,例如“Tkinter.Toplevel(master, class_='ClassName')”。

  • __double_leading_underscore (雙下畫線):從 Python 1.4 起為類私有名。

  • __double_leading_and_trailing_underscore__:特殊的(magic) 對象或?qū)傩?,存在?br/> 用戶控制的(user-controlled)名字空間,例如:__init__、__import__ 或 __file__。

9 引號用法規(guī)則

  • 自然語言使用雙引號

  • 機器標識使用單引號

  • 正則表達式使用雙引號

  • 文檔字符串 (docstring) 使用三個雙引號

字符串引號規(guī)則:

  • 單引號和雙引號字符串是相同的。當一個字符串中包含單引號或者雙引號字符串的時候,使用和最外層不同的符號來避免使用反斜杠,從而提高可讀性。

  • 在同一個文件中,保持使用字符串引號的一致性。在字符串內(nèi)可以使用另外一種引號,以避免在字符串中使用。

正確使用示例:

Tim('Why are you hiding your eyes?')
Bob("I'm scared of lint errors.")
Juy('"Good!" thought a happy Python reviewer.')
  • 當且僅當代碼中使用單引號'來引用字符串時,才可能會使用三重'''為非文檔字符串的多行字符串來標識引用

  • 文檔字符串必須使用三重雙引號"""

10 模塊導入規(guī)則

  • 導入應該放在文件頂部,位于模塊注釋和文檔字符串之后,模塊全局變量和常量之前。

  • 導入應該按照從最通用到最不通用的順序分組:標準庫導入、第三方庫導入、應用程序指定導入,分組之間空一行。

  • 模塊名稱要短,使用小寫,并避免使用特殊符號, 比如點和問號。

  • 盡量保持模塊名簡單,以無需分開單詞最佳(不推薦在兩個單詞之間使用下劃線)。

  • 每個導入應該獨占一行。

正確使用例子:

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 *差, 不清楚具體從模塊中導入了哪些內(nèi)容
from modu import sqrt稍好

import modu

import modu.sqrt

最佳 , 調(diào)用的時候直接使用modu.sqrt能比較清楚的知道當前方法屬于哪個模塊

import os

import sys

推薦

import os, sys

不推薦
from subprocess import Popen, PIPE推薦

11 Main

主功能應該放在一個main()函數(shù)中。

在Python中,pydoc以及單元測試要求模塊必須是可導入的。代碼應該在執(zhí)行主程序前總是檢查 if __name__ == '__main__', 這樣當模塊被導入時主程序就不會被執(zhí)行。

def main():
      ...

if __name__ == '__main__':
    main()

12 函數(shù)設計規(guī)范

  • 函數(shù)設計的主要目標就是最大化代碼重用和最小化代碼冗余。精心設計的函數(shù)不僅可以提高程序的健壯性,還可以增強可讀性、減少維護成本。

  • 函數(shù)設計要盡量短小,嵌套層次不宜過深。 所謂短小, 就是盡量避免過長函數(shù), 因為這樣不需要上下拉動滾動條就能獲得整體感觀, 而不是來回翻動屏幕去尋找某個變量或者某條邏輯判斷等。 函數(shù)中需要用到 if、 elif、 while 、 for 等循環(huán)語句的地方,盡量不要嵌套過深,最好能控制在3層以內(nèi)。不然有時候為了弄清楚哪段代碼屬于內(nèi)部嵌套, 哪段屬于中間層次的嵌套, 哪段屬于更外一層的嵌套所花費的時間比讀代碼細節(jié)所用時間更多。

  • 盡可能通過參數(shù)接受輸入,以及通過return產(chǎn)生輸出以保證函數(shù)的獨立性。

  • 盡量減少使用全局變量進行函數(shù)間通信。

  • 不要在函數(shù)中直接修改可變類型的參數(shù)。

  • 函數(shù)申明應該做到合理、 簡單、 易于使用。 除了函數(shù)名能夠正確反映其大體功能外, 參數(shù)的設計也應該簡潔明了, 參數(shù)個數(shù)不宜太多。 參數(shù)太多帶來的弊端是: 調(diào)用者需要花費更多的時間去理解每個參數(shù)的意思,測試的時候測試用例編寫的難度也會加大。

  • 函數(shù)參數(shù)設計應該考慮向下兼容。

13 版本注記

如果要將 RCS 或 CVS 的雜項包含在你的源文件中,按如下格式操作:

__version__ = "$Revision: 1.4 $" 
# $Source: E:/cvsroot/python_doc/pep8.txt,v $

對于 CVS 的服務器工作標記更應該在代碼段中明確出它的使用說明,如在文檔最開始的版權(quán)聲明后應加入如下版本標記:

# 文件:$id$ 
# 版本:$Revision$

這樣的標記在提交給配置管理服務器后,會自動適配成為相應的字符串,如:

# 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $ 
# 版本:$Revision: 1.4 $

這些應該包含在模塊的文檔字符串之后,所有代碼之前,上下用一個空行分割。

感謝各位的閱讀,以上就是“Python編碼規(guī)范知識點實例分析”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Python編碼規(guī)范知識點實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI