1. 程式人生 > >Python 學習歷程- 看我一步一步走過來 未完待續。。。

Python 學習歷程- 看我一步一步走過來 未完待續。。。

轉眼間,入職一年整。回想當初剛畢業時的意氣風發,還是從頭開始,一步一個腳印學好python,掌握一門技能的好。

Step 1: 掌握基本的程式設計規範:

個人總結如下:

行長度

每行不超過80個字元

以下情況除外:

  1. 長的匯入模組語句
  2. 註釋裡的URL

不要使用反斜槓連線行。

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

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

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

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

在註釋中,如果必要,將長的URL放在一行上。

推薦:# See details at# http://www.example.com/us/developer/documentation/api/content/v2.0/csv_file_name_extension_full_specification.html

分號

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

PS: 千萬記得,因為在很多其他語言中,都是以;來結尾的。這是區別所在

縮排

用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,...}# 4 個空格縮排,第一行不需要 foo = long_function_name( var_one, var_two, var_three, var_four)# 字典中 4 個空格縮排 foo ={ long_dictionary_key: long_dictionary_value,...}

括號

寧缺毋濫的使用括號

除非是用於實現行連線, 否則不要在返回語句或條件語句中使用括號. 不過在元組兩邊使用括號是可以的.

Yes:if foo:
         bar()while x:
         x = bar()if x and y:
         bar()ifnot x:
         bar()return foo
     for(x, y)in dict.items():...

空格

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

括號內不要有空格.

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

Yes: spam(ham[1],{eggs:2},[])
No:  spam( ham[1],{ eggs:2},[])

不要在逗號, 分號, 冒號前面加空格, 但應該在它們後面加(除了在行尾).

Yes:if x ==4:print x, y
     x, y = y, x
No:if x ==4:print x , y
     x , y = y , x

引數列表, 索引或切片的左括號前不應加空格.

Yes: spam(1)
no: spam (1)
Yes: dict['key']= list[index]
No:  dict ['key']= list [index]

在二元操作符兩邊都加上一個空格, 比如賦值(=), 比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布林(and, or, not). 至於算術操作符兩邊的空格該如何使用, 需要你自己好好判斷. 不過兩側務必要保持一致.

Yes: x ==1
No:  x<1

當'='用於指示關鍵字引數或預設引數值時, 不要在其兩側使用空格.

Yes:def complex(real, imag=0.0):return magic(r=real, i=imag)
No:def complex(real, imag =0.0):return magic(r = real, i = imag)

不要用空格來垂直對齊多行間的標記, 因為這會成為維護的負擔(適用於:, #, =等):

Yes:
     foo =1000# 註釋
     long_name =2# 註釋不需要對齊

     dictionary ={"foo":1,"long_name":2,}

空行

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

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


註釋

確保對模組, 函式, 方法和行內註釋使用正確的風格

文件字串

Python有一種獨一無二的的註釋方式: 使用文件字串. 文件字串是包, 模組, 類或函式裡的第一個語句. 這些字串可以通過物件的__doc__成員被自動提取, 並且被pydoc所用. (你可以在你的模組上執行pydoc試一把, 看看它長什麼樣). 我們對文件字串的慣例是使用三重雙引號"""( PEP-257 ). 一個文件字串應該這樣組織: 首先是一行以句號, 問號或驚歎號結尾的概述(或者該文件字串單純只有一行). 接著是一個空行. 接著是文件字串剩下的部分, 它應該與文件字串的第一行的第一個引號對齊. 下面有更多文件字串的格式化規範.

模組

每個檔案應該包含一個許可樣板. 根據專案使用的許可(例如, Apache 2.0, BSD, LGPL, GPL), 選擇合適的樣板.

函式和方法

下文所指的函式,包括函式, 方法, 以及生成器.

一個函式必須要有文件字串, 除非它滿足以下條件:

  1. 外部不可見
  2. 非常短小
  3. 簡單明瞭

文件字串應該包含函式做什麼, 以及輸入和輸出的詳細描述. 通常, 不應該描述"怎麼做", 除非是一些複雜的演算法. 文件字串應該提供足夠的資訊, 當別人編寫程式碼呼叫該函式時, 他不需要看一行程式碼, 只要看文件字串就可以了. 對於複雜的程式碼, 在程式碼旁邊加註釋會比使用文件字串更有意義.

關於函式的幾個方面應該在特定的小節中進行描述記錄, 這幾個方面如下文所述. 每節應該以一個標題行開始. 標題行以冒號結尾. 除標題行外, 節的其他內容應被縮排2個空格.

Args:
列出每個引數的名字, 並在名字後使用一個冒號和一個空格, 分隔對該引數的描述.如果描述太長超過了單行80字元,使用2或者4個空格的懸掛縮排(與檔案其他部分保持一致). 描述應該包括所需的型別和含義. 如果一個函式接受*foo(可變長度引數列表)或者**bar (任意關鍵字引數), 應該詳細列出*foo和**bar.
Returns: (或者 Yields: 用於生成器)
描述返回值的型別和語義. 如果函式返回None, 這一部分可以省略.
Raises:
列出與介面有關的所有異常.
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):"""Fetches rows from a Bigtable.

    Retrieves rows pertaining to the given keys from the Table instance
    represented by big_table.  Silly things may happen if
    other_silly_variable is not None.

    Args:
        big_table: An open Bigtable Table instance.
        keys: A sequence of strings representing the key of each table row
            to fetch.
        other_silly_variable: Another optional variable, that has a much
            longer name than the other args, and which does nothing.

    Returns:
        A dict mapping keys to the corresponding table row data
        fetched. Each row is represented as a tuple of strings. For
        example:

        {'Serak': ('Rigel VII', 'Preparer'),
         'Zim': ('Irk', 'Invader'),
         'Lrrr': ('Omicron Persei 8', 'Emperor')}

        If a key from the keys argument is missing from the dictionary,
        then that row was not found in the table.

    Raises:
        IOError: An error occurred accessing the bigtable.Table object.
    """pass

參考link