python小技巧

  在python中,實際書寫代碼還有不少須要注意的東西,有時候會讓代碼的執行效率提升,下面就讓咱們來學習PEP 8風格以及Python編程慣例的一些知識吧。


java

一: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跟其餘不少編程語言在語法和使用上仍是有比較顯著的差異,所以做爲一個Python開發者若是不能掌握一些慣例,就沒法寫出"Pythonic"(python風格,pythonic code,就是說你寫的代碼要帶有濃厚的python規範和python風格)的高效代碼。


1.讓代碼既能夠被導入又能夠被執行。

git

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.不使用臨時變量交換兩個值。
app

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)
相關文章
相關標籤/搜索