當前位置 博文首頁 > 信息技術智庫:天天都在寫python,你寫的破代碼,別人能看懂嗎?

    信息技術智庫:天天都在寫python,你寫的破代碼,別人能看懂嗎?

    作者:[db:作者] 時間:2021-09-13 19:05

    一千個讀者有一千個哈姆萊特。? ? ? ? -- 莎士比亞

    一千個程序員有一千套編碼規范。? ? ?-- 不吃西紅柿

    作者:不吃西紅柿

    簡介:CSDN博客專家、藍橋簽約作者、大數據&Python領域優質創作者。

    【求點贊、求收藏、求評論】

    Python 編碼規范重要性的原因用一句話來概括就是:統一的編碼規范可以提高開發效率。

    無論你是 編程者,還是 閱讀者,好的規范能讓你的效率事半功倍,甚至機器在運行時,提高程序運行的效率。今天西紅柿就帶你盤一盤python的編碼規范。

    ps.python的代碼編寫基本上都要遵循PEP8的風格

    1、分號

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

    2、命名

    module_name, package_name, ClassName, method_name

    應該避免的名稱

    1. 單字符名稱, 除了計數器和迭代器.
    2. 包/模塊名中的連字符(-)
    3. 雙下劃線開頭并結尾的名稱(Python保留, 例如__init__)

    命名約定

    1. 所謂"內部(Internal)"表示僅模塊內可用, 或者, 在類內是保護或私有的.
    2. 用單下劃線(_)開頭表示模塊變量或函數是protected的(使用import * from時不會包含).
    3. 用雙下劃線(__)開頭的實例變量或方法表示類內私有.
    4. 將相關的類和頂級函數放在同一個模塊里. 不像Java, 沒必要限制一個類一個模塊.
    5. 對類名使用大寫字母開頭的單詞(如CapWords, 即Pascal風格), 但是模塊名應該用小寫加下劃線的方式(如lower_with_under.py). 盡管已經有很多現存的模塊使用類似于CapWords.py這樣的命名, 但現在已經不鼓勵這樣做, 因為如果模塊名碰巧和類名一致, 這會讓人困擾.

    3、行長度

    每行不超過80個字符

    以下情況除外:

    1. 長的導入模塊語句
    2. 注釋里的URL

    不要使用反斜杠連接行。

    Python會將?圓括號, 中括號和花括號中的行隱式的連接起來?, 你可以利用這個特點. 如果需要, 你可以在表達式外圍增加一對額外的圓括號。

    推薦:?

    foo_bar(self, width, height, color='black', design=None, x='foo',
                 emphasis=None, highlight=0)
    
         if (width == 0 and height == 0 and
             color == 'red' and emphasis == 'strong'):

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

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

    4、縮進

    用4個空格來縮進代碼

    絕對不要用tab, 也不要tab和空格混用. 對于行連接的情況, 你應該要么垂直對齊換行的元素(見 :ref:`行長度 <line_length>` 部分的示例), 或者使用4空格的懸掛式縮進(這時第一行不應該有參數):

           # 與起始變量對齊
           foo = long_function_name(var_one, var_two,
                                    var_three, var_four)
    
           # 字典中與起始值對齊
           foo = {
               long_dictionary_key: value1 +
                                    value2,
               ...
           }

    5、空行

    頂級定義之間空兩行, 方法定義之間空一行

    頂級定義之間空兩行, 比如函數或者類定義. 方法定義, 類定義與第一個方法之間, 都應該空一行. 函數或方法中, 某些地方要是你覺得合適, 就空一行.


    6、空格

    按照標準的排版規范來使用標點兩邊的空格

    括號內不要有空格.

    按照標準的排版規范來使用標點兩邊的空格

    正確示范: spam(ham[1], {eggs: 2}, [])
    錯誤示范:  spam( ham[ 1 ], { eggs: 2 }, [ ] )

    7、類

    類應該在其定義下有一個用于描述該類的文檔字符串. 如果你的類有公共屬性(Attributes), 那么文檔中應該有一個屬性(Attributes)段. 并且應該遵守和函數參數相同的格式.

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

    8、塊注釋和行注釋

    最需要寫注釋的是代碼中那些技巧性的部分. 如果你在下次?代碼審查?的時候必須解釋一下, 那么你應該現在就給它寫注釋. 對于復雜的操作, 應該在其操作開始前寫上若干行注釋. 對于不是一目了然的代碼, 應在其行尾添加注釋.

    # 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 iff i is a power of 2

    為了提高可讀性, 注釋應該至少離開代碼2個空格.

    另一方面, 絕不要描述代碼. 假設閱讀代碼的人比你更懂Python, 他只是不知道你的代碼要做什么.

    # BAD COMMENT: Now go through the b array and make sure whenever i occurs
    # the next element is i+1

    9、字符串

    正確示范: 
    ?    x = a + b
         x = '%s, %s!' % (imperative, expletive)
         x = '{}, {}!'.format(imperative, expletive)
         x = 'name: %s; score: %d' % (name, n)
         x = 'name: {}; score: {}'.format(name, n)
    錯誤示范: 
    ?   x = '%s%s' % (a, b)  # use + in this case
        x = '{}{}'.format(a, b)  # use + in this case
        x = imperative + ', ' + expletive + '!'
        x = 'name: ' + name + '; score: ' + str(n)

    10、導包

    每個導入應該獨占一行

    正確示范:
       import os
       import sys
    錯誤示范:  
    ?  import os, sys

    導入總應該放在文件頂部, 位于模塊注釋和文檔字符串之后, 模塊全局變量和常量之前. 導入應該按照從最通用到最不通用的順序分組:

    1. 標準庫導入
    2. 第三方庫導入
    3. 應用程序指定導入

    【總結】

    1.命名

    1. 函數、變量及屬性都應該用小寫單詞拼寫,只見用_連接,不遵循駝峰命名法
    2. 類與異常應該首字母大寫,不要用_連接
    3. 受保護的實例屬性,應以單下劃線開頭
    4. 實例的私有屬性,應以雙下劃線開頭
    5. 模塊級別的變量單詞都要大寫,中間以單下劃線隔開
    6. 變量要盡可能有意義

    2.空白

    1. 和語法相關的每一層縮進都用4個空格表示
    2. 賦值時等號兩邊都要有一個空格
    3. 每一行所占用的字符數應不超過79,實際操作中應當盡量不讓代碼編輯器的行滾動條顯示出來
    4. 在使用函數進行函數式編程時,函數之間要空兩行
    5. 在類中的函數,函數之間應該空一行
    6. 函數與類是同一個級別,則他們之間應該空兩行
    7. 對于超出每行規定的字符數的長表達式,應當敲回車縮進,通常除了首行其余各行都要在原來的基礎上再次縮進4個空格

    3.語句

    1. 判斷變量是否為None、False或True時不要用==,要用is,例如,if a is None
    2. import語句應放在句首,導入時要盡量使用絕對導入不要使用相對導入,并且導入時最好指定相應的模塊的某一具體功能,例如,from datetime import datetime
    3. 模塊導入時應根據標準庫模塊、第三方模塊以及自用模塊進行分類
    4. 檢測容器不為空時,應使用if 容器名,例如,lists = [] if lists
    5. 采用內聯形式的否定詞,不要把否定詞放在整個表達式的前面,例如,應該if a is not None 而不是 if not a is None

    4.注釋

    1. 對某些重要的代碼塊的功能說明,應使用單行注釋
    2. 對整個模塊功能的說明應使用多行注釋
    3. 對類或函數的功能及使用方法的詳細說明應使用文檔字符串
    4. python的注釋盡量使用英文

    ??

    【求評論、求點贊、求收藏】?


    cs
程序員cxuan的個人主頁:這篇 Java 基礎,我吹不動了 小小張自由―>張有博:軟件工程――編碼、測試、維護 小小張自由―>張有博:淺談面向對象方法學 小小張自由―>張有博:UML――概述(事物、關系、圖) 小小張自由―>張有博:UML――用例圖 小小張自由―>張有博:UML――活動圖和狀態圖 小小張自由―>張有博:UML――交互圖(順序圖與協作圖) 小小張自由―>張有博:UML――實現圖(構件圖與部署圖) 小小張自由―>張有博:C#編程基礎――C#與.NET的關系 小小張自由―>張有博:C#編程基礎――數據類型 小小張自由―>張有博:C#編程基礎――常量與變量 小小張自由―>張有博:C#編程基礎――運算符與表達式 小小張自由―>張有博:C#編程基礎――循環語句 小小張自由―>張有博:C#編程基礎――跳轉語句 小小張自由―>張有博:C#編程基礎――類 小小張自由―>張有博:C#編程基礎――方法 小小張自由―>張有博:初始三層架構(超超超詳細) 小小張自由―>張有博:C#連接數據庫之Connection、Command、D 小小張自由―>張有博:System.ArgumentOutOfRangeException: 小小張自由―>張有博:機房重構之單例模式的應用 小小張自由―>張有博:機房重構之備忘錄模式的應用 小小張自由―>張有博:機房重構之職責鏈模式的應用 小小張自由―>張有博:HTML基礎――標簽 小小張自由―>張有博:div+css的入門知識 小小張自由―>張有博:CSS核心內容:標準流、盒子模型、浮動 小小張自由―>張有博:asp.net生成驗證碼并提交驗證 小小張自由―>張有博:XML基礎 小小張自由―>張有博:各種計算機語言簡短簡介 小小張自由―>張有博:2020年10月自考總結 小小張自由―>張有博:vs2019利用gitee(碼云)協作開發 小小張自由―>張有博:1024程序員節 小小張自由―>張有博:IDEA2020.3詳細安裝教程 小小張自由―>張有博:JavaWeb之Request與Response詳解 小小張自由―>張有博:JavaWeb之Filter和Listener 小小張自由―>張有博:Vue插件報錯:Vue.js is detected on t 小小張自由―>張有博:在項目中使用Spring Cloud Alibaba Sen 小小張自由―>張有博:在項目中使用OpenFeign 小小張自由―>張有博:解決idea打開Vue項目報紅 小小張自由―>張有博:CentOS7詳細安裝教程--圖文介紹超詳細 zhtbs的博客:Springboot 入門培訓 5 Thymeleaf 與 MVC項目搭建 zhtbs的博客:(Framework7 移動webapp) Springboot 入門培訓 7 zhtbs的博客:HTML+CSS+JavaScript 迷宮生成算法 【建議收藏】 zhtbs的博客:(Framework7 移動webapp) Springboot 入門培訓 8 C zhtbs的博客:Springboot 入門培訓 9 Security(一) 登錄驗證 zhtbs的博客:Springboot 入門培訓 4 WEB+JSP MVC項目搭建 zhtbs的博客:Springboot 入門培訓 10 Security(二) 數據庫DB 貓耳山在天邊:《Linux命令行與shell腳本編程大全》(第三版)讀 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 qq1113673178的博客:[學習][筆記] qt5 從入門到入墳:<12>Grap qq1113673178的博客:[學習][筆記] qt5 從入門到入墳:<13>基于 .net平臺的rabbitmq使用封裝demo詳解 C++類的特種函數生成機制詳解 Python調用百度AI實現圖片上表格識別功能 node自定義安裝更改npm全局模塊默認安裝路徑的步驟 帶你用C語言實現strtok和字符串分割函數 靜態網頁和靜態網頁性能比較 網頁標題優化原則和描述優化原則 php 怎么設置cookie記住密碼 php設置時區無效怎么辦 php __autoload 失效怎么辦 有關PHP調試的小技巧,看看吧! 從0開始:教你微信小店怎么開! 成本5元竟然賣50元 微信朋友圈賣面膜真黑啊 HashMap原理及put方法與get方法的調用過程 基于IDEA 的遠程調試 Weblogic的操作過程 UTC時間、GMT時間、本地時間、Unix時間戳的具體使用 如何利用SwiftUI實現可縮放的圖片預覽器 網站怎么利用內容更新雙重境界快速提高網站權重? php顯示繁體亂碼怎么辦 php不能開啟php_curl怎么辦
A级免费视频