[TOC] 在python中,實際書寫代碼還有很多需要註意的東西,有時候會讓代碼的執行效率提高,下麵就讓我們來學習PEP 8風格以及Python編程慣例的一些知識吧。 一:PEP 8風格 PEP是Python Enhancement Proposal的 ...
目錄
在python中,實際書寫代碼還有很多需要註意的東西,有時候會讓代碼的執行效率提高,下麵就讓我們來學習PEP 8風格以及Python編程慣例的一些知識吧。
一:PEP 8風格
PEP是Python Enhancement Proposal的縮寫,通常翻譯為“Python增強提案”。其中的第8號增強提案(PEP 8)是針對Python語言編訂的代碼風格指南。
在實際開發中,採用一致的風格書寫出可讀性強的代碼是每個專業的程式員應該做到的事情,也是每個公司的編程規範中會提出的要求,這些在多人協作開發一個項目(團隊開發)的時候顯得尤為重要。
官方鏈接:https://www.python.org/dev/peps/pep-0008/
下麵只介紹關鍵部分:
1.空格的使用
(1)使用空格來表示縮進而不要用製表符(Tab):這是由於。但是如果喜歡用Tab的話,就需要把使用的編輯器的Tab鍵設定為四個空格。
(2)每行的字元數不要超過79個字元。
(3)如果表達式因太長而占據了多行,除了首行之外的其餘各行都應該在正常的縮進寬度上再加上4個空格。
(4)函數和類的定義,代碼前後都要用兩個空行進行分隔。
(5)在同一個類中,各個方法之間應該用一個空行進行分隔。
(6)二元運算符的左右兩側應該保留一個空格,而且只要一個空格就好。
2.標識符的命名
PEP 8倡導用不同的命名風格來命名Python中不同的標識符,以便在閱讀代碼時能夠通過標識符的名稱來確定該標識符在Python中扮演了怎樣的角色。
(1)變數、函數和屬性應該使用小寫字母來拼寫,如果有多個單詞就使用下劃線進行連接。
(2)類中受保護的實例屬性,應該以一個下劃線開頭。
(3)類中私有的實例屬性,應該以兩個下劃線開頭。
(4)類和異常的命名,應該每個單詞首字母大寫。
(5)模塊級別的常量,應該採用全大寫字母,如果有多個單詞就用下劃線進行連接。
(6)類的實例方法,應該把第一個參數命名為self以表示對象自身。
(7)類的類方法,應該把第一個參數命名為cls以表示該類自身。
3.表達式和語句
(1)採用內聯形式的否定詞,而不要把否定詞放在整個表達式的前面。例如if a is not b就比if not a is b更容易讓人理解。
(2)不要用檢查長度的方式來判斷字元串、列表等是否為None或者沒有元素,應該用 if not x 這樣的寫法來檢查它。
(3)就算if分支、for迴圈、except異常捕獲等中只有一行代碼,也不要將代碼和if、for、except等寫在一起,分開寫才會讓代碼更清晰。
(4)import語句總是放在文件開頭的地方。
(5)引入模塊的時候,from math import sqrt比import math更好。
(6)如果有多個import語句,應該將其分為三部分,從上到下分別是Python標準模塊、第三方模塊和自定義模塊,每個部分內部應該按照模塊名稱的字母表順序來排列。
二:Python編程慣例
由於Python跟其他很多編程語言在語法和使用上還是有比較顯著的差別,因此作為一個Python開發者如果不能掌握一些慣例,就無法寫出"Pythonic"(python風格,pythonic code,就是說你寫的代碼要帶有濃厚的python規範和python風格)的高效代碼。
1.讓代碼既可以被導入又可以被執行。
if __name__ == '__main__':
2.用下麵的方式判斷邏輯“真”或“假”。
if x:
if not x:
# 實例
name = 'jackfrued'
fruits = ['apple', 'orange', 'grape']
owners = {'1001': 'a', '1002': 'b'}
# 好的代碼
if name and fruits and owners:
print('I love fruits!')
# 不好的代碼
if name != '' and len(fruits) > 0 and owners != {}:
print('I love fruits!')
3.善於使用in運算符。
if x in items: # 包含
for x in items: # 迭代
# 實例
name = 'Hao LUO'
# 好的代碼
if 'L' in name:
print('The name has an L in it.')
# 不好的代碼
if name.find('L') != -1:
print('This name has an L in it!')
4.不使用臨時變數交換兩個值。
a, b = b, a
5.用序列構建字元串。
chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
# 好的代碼
name = ''.join(chars)
print(name) # jackfrued
# 不好的代碼
name = ''
for char in chars:
name += char
print(name) # jackfrued
6.EAFP優於LBYL。
d = {'x': '5'}
# 好的代碼
try:
value = int(d['x'])
print(value)
except (KeyError, TypeError, ValueError):
value = None
# 不好的代碼
d = {'x': '5'}
if 'x' in d and isinstance(d['x'], str) \
and d['x'].isdigit():
value = int(d['x'])
print(value)
else:
value = None
7.使用enumerate進行迭代。
fruits = ['orange', 'grape', 'pitaya', 'blueberry']
# 好的代碼
for index, fruit in enumerate(fruits):
print(index, ':', fruit)
# 不好的代碼
index = 0
for fruit in fruits:
print(index, ':', fruit)
index += 1
8.用生成式生成列表。
data = [7, 20, 3, 15, 11]
# 好的代碼
result = [num * 3 for num in data if num > 10]
print(result)
# 不好的代碼
result = []
for i in data:
if i > 10:
result.append(i * 3)
print(result)
9.用zip組合鍵和值來創建字典。
keys = ['1001', '1002', '1003']
values = ['a', 'b', 'c']
# 好的代碼
d = dict(zip(keys, values))
print(d)
# 不好的代碼
d = {}
for i, key in enumerate(keys):
d[key] = values[i]
print(d)