PEP 8-Python編碼規範整理

weixin_33912445發表於2017-11-10
3428666-49a1344b0d37a0a2
學習.png

我是用Python的IDE:pycharm來編寫Python程式碼的,用IDE編寫程式碼有一個好處就是語法高亮,智慧提示。Python的程式碼樣式規範稱之為PEP 8規範,每次編寫程式碼如果有出現不符合PEP 8規範的話,pycharm就會提示我,就像下面這樣:

3428666-2b6e396cf0227a92
image

上面的提示意思就是:語句後面跟註釋的話至少要隔兩個空格,而我只打了一個空格。

養成一個良好的編碼習慣是非常重要的,因為程式碼是寫給人讀的,一手漂亮的程式碼看起來就是賞心悅目。在學習程式設計之初就要有意培養起良好的編碼風格,這是很受益的。

於是我就特意整理了一下PEP 8規範中一些常用的準則,如果需要掌握更加詳盡的Python程式碼規範,請看PEP 8的官方文件:

https://www.python.org/dev/peps/pep-0008/

一:程式碼佈局

1 縮排:

每個縮排級別使用4個空格。

def __init__(self):
    """初始化屬性"""
   self.new_urls = set()  # 未爬取的url集合
   self.old_urls = set()  # 已爬取的url集合

2 製表符or空格?

空格是首選的縮排方法。
Python 3不允許混合使用製表符和空格來縮排。
Python 2程式碼縮排與製表符和空格的混合應轉換為使用空格專有。

有研究顯示:使用空格縮排的程式設計師的薪資比使用製表符縮排的程式設計師的薪資多8%。所以一定要用空格縮排呀。

3 每行程式碼的最大長度:

將所有行限制為最多79個字元。
Python標準庫是保守的,需要將行限制為79個字元(文件字串/註釋為72)。

4 空白行:

用兩個空白行分隔頂層函式和類定義。
類中的方法定義用一個空行分隔。
可以使用額外的空白行(節省空間)來分隔相關功能組。在一堆相關的單行程式(例如一組虛擬執行程式)之間可能會省略空白行。
在函式中使用空行來節省邏輯部分。
恰當的使用空白行可以提高程式碼的可讀性。

5 原始檔編碼:

核心Python發行版中的程式碼應該始終使用UTF-8(或Python 2中的ASCII)。
使用ASCII(Python 2)或UTF-8(Python 3)的檔案不應該有編碼宣告。
但是在Python 2中使用UTF-8編碼就需要有編碼宣告:

# -*- coding: utf-8 -*-
#! /usr/bin/env python2

上面兩行程式碼常放在Python 2程式碼中的開頭,第一行意思是指定原始檔以utf-8格式編碼,第二行意思是指定原始檔的python直譯器在環境變數中去尋找。

6 匯入庫函式:

若是匯入多個庫函式,應該分開依次匯入:

import requests
import csv

匯入總是放在檔案的頂部,在任何模組註釋和文件字串之後,在模組全域性變數和常量之前。

"""
一種簡單的方式是使用模組json來儲存資料
"""
# 使用函式json.dump()來儲存資料# 函式json.dump()接受兩個物件:要儲存的資料以及可用於儲存資料的檔案物件
import json

numbers = [2, 3, 5, 7, 11, 13]
filename = "numbers.json"  # 使用副檔名.json來指出檔案儲存的資料為JSON格式with open(filename, "w") as file_object:  # 以寫入模式開啟檔案
    json.dump(numbers, file_object)

匯入應按以下順序進行:
① 標準庫匯入
② 有關的第三方庫進口
③ 本地應用程式/庫特定的匯入

import sys
import pygamefrom bullet 
import Bulletfrom alien 
import Alienfrom time 
import sleep

從包含類的模組中匯入一個類時,通常可以這樣寫:

from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboard

應避免萬用字元匯入(import *),因為它們使名稱空間中出現的名稱不清楚

二:字串

1 在Python中,單引號字串和雙引號字串是相同的。這個PEP沒有為此提出建議。

2 對於三引號字串,常用三個雙引號作文件字串,文件字串常用在模組的開端用以說明模組的基本功能,或緊跟函式定義的後面用以說明函式的基本功能,關於三引號字串更多具體的細節,可以查閱其官方文件:

https://www.python.org/dev/peps/pep-0257/

三:表示式和語句中的空格
1 在以下情況下避免無關的空格:

① 在括號或大括號內:

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

② 在尾隨逗號和後面的右括號之間:

Yes: foo = (0,) 
No:  bar = (0, )

③ 在逗號,分號或冒號前面:

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: dct['key'] = lst[index] 
No:  dct ['key'] = lst [index]

⑥ 在一個賦值(或其他)運算子周圍有多於一個的空間來對齊它:

Yes:

x = 1 y = 2 long_variable = 3

No:

x             = 1 y             = 2 long_variable = 3

2 其他建議:

① 總是圍繞這些二元運算子在兩側使用一個空格:

賦值(=),擴充賦值(+ =,- = 等),
比較(==,<,>,!=,<>,<=, > =,在,不在,是,是不是),
布林值(和, 或,不)

② 用於指示關鍵字引數或預設引數值時,不要在=符號周圍使用空格。

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)

四:註釋

1 程式碼更改時,相應的註釋也要隨之更改。

2 塊註釋:塊註釋通常適用於後面的一些(或全部)程式碼,並縮排到與該程式碼相同的級別。塊註釋的每一行都以#和一個空格開始。

3 行註釋:顧名思義就是對某一語句行進行註釋,註釋應該與語句至少隔開兩個空格,用#和一個空格開始。

五:命名約定

1 採用描述性的命名規則,例如一個實現某種功能的類或函式,那這個類或函式的名字就以相應的功能實現作為命名,簡單易懂。

2 類的命名採用駝峰命名法,即每個單詞的首字母大寫。

3 切勿將字元’l’(小寫字母el),’O’(大寫字母oh)或’I’(大寫字母)作為單個字元變數名稱。在一些字型中,這些字元與數字1和零是無法區分的。當試圖使用“l”時,請使用“L”。

4 函式名稱應該是小寫的,為了提高可讀性,必須使用由下劃線分隔的單詞。如果函式引數的名稱與保留關鍵字衝突,通常最好追加一個尾部下劃線,而不是使用縮寫或拼寫損壞。

更多具體的編碼規範請查閱其官方文件:

https://github.com/python/peps/blob/master/pep-0008.txt

每天學習一點點,每天進步一點點.

相關文章