我是用Python的IDE:pycharm來編寫Python代碼的,用IDE編寫代碼有一個好處就是語法高亮,智能提示。Python的代碼樣式規范稱之為PEP 8規范,每次編寫代碼如果有出現不符合PEP 8規范的話,pycharm就會提示我,就像下面這樣:
上面的提示意思就是:語句后面跟注釋的話至少要隔兩個空格,而我只打了一個空格。
養成一個良好的編碼習慣是非常重要的,因為代碼是寫給人讀的,一手漂亮的代碼看起來就是賞心悅目。在學習編程之初就要有意培養起良好的編碼風格,這是很受益的。
于是我就特意整理了一下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
每天學習一點點,每天進步一點點.