Python 學習歷程- 看我一步一步走過來 未完待續。。。
轉眼間,入職一年整。回想當初剛畢業時的意氣風發,還是從頭開始,一步一個腳印學好python,掌握一門技能的好。
Step 1: 掌握基本的程式設計規範:
個人總結如下:
行長度
每行不超過80個字元
以下情況除外:
- 長的匯入模組語句
- 註釋裡的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), 選擇合適的樣板.
函式和方法
下文所指的函式,包括函式, 方法, 以及生成器.
一個函式必須要有文件字串, 除非它滿足以下條件:
- 外部不可見
- 非常短小
- 簡單明瞭
文件字串應該包含函式做什麼, 以及輸入和輸出的詳細描述. 通常, 不應該描述"怎麼做", 除非是一些複雜的演算法. 文件字串應該提供足夠的資訊, 當別人編寫程式碼呼叫該函式時, 他不需要看一行程式碼, 只要看文件字串就可以了. 對於複雜的程式碼, 在程式碼旁邊加註釋會比使用文件字串更有意義.
關於函式的幾個方面應該在特定的小節中進行描述記錄, 這幾個方面如下文所述. 每節應該以一個標題行開始. 標題行以冒號結尾. 除標題行外, 節的其他內容應被縮排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