6 個例子教你重構 Python 代碼

1. 合併嵌套的 if 條件html

太多的嵌套會使代碼難以理解,這在 Python 中尤其如此,由於 Python 沒有括號來幫助區隔不一樣的嵌套級別。python

閱讀深度嵌套的代碼容易讓人煩躁,由於你必須理清哪些條件屬於哪一級。所以,咱們應儘量減小嵌套,若是兩個條件能夠用 and 合在一塊兒,會比嵌套更易讀。數據庫

合併以前:安全

  1. if a:網絡

  2. if b:app

  3. return c函數

合併後:oop

  1. if a and b:性能

  2. return c學習

2. 將重複的代碼移到條件語句以外

咱們應該始終尋找移除重複代碼的方法。這是提高代碼能力的好辦法。

有時,在條件的兩個分支上出現重複代碼,這意味這段代碼將始終執行。所以這段重複的代碼能夠從條件中移出,放在條件以外執行。

  1. if sold > DISCOUNT_AMOUNT:

  2. total = sold * DISCOUNT_PRICE

  3. label = f'Total: {total}'

  4. else:

  5. total = sold * PRICE

  6. label = f'Total: {total}'

經過將對label變量賦值移到到條件以外,咱們刪除了重複的代碼行,並明確了條件實際控制的內容,就是計算total。

  1. if sold > DISCOUNT_AMOUNT:

  2. total = sold * DISCOUNT_PRICE

  3. else:

  4. total = sold * PRICE

  5. label = f'Total: {total}'

3. 將內部循環中的yield替換爲yield from

常常忽略的一個小竅門是 Python 的yield關鍵字有對應的爲collections準備的yield from。所以無需使用 for 循環遍歷集合。這使代碼變短,並刪除 for 中的額外變量。並且消除 for 循環後,yield from使程序運行效率提升約 15%。

重構前:

  1. def get_content(entry):

  2. for block in entry.get_blocks():

  3. yield block

重構後:

  1. def get_content(entry):

  2. yield from entry.get_blocks()

4. 使用 any() 而不是用於循環

常見的模式是,咱們須要查找是否集合中的一個或多個項符合某些條件。這能夠經過 for 循環完成,例如:

  1. found = False

  2. for thing in things:

  3. if thing == other_thing:

  4. found = True

  5. break

更簡潔的方法,是使用 Python 的 any() 和 all()內置函數,來清楚地顯示代碼的意圖。

found = any(thing == other_thing for thing in things)

當至少有一個元素計算爲 True 時,all() 將返回 True,只有當全部元素都計算爲 True 時,all() 將返回 True。

若是對 any() 的調用找到一個值值爲 True 的元素,它能夠當即返回。

5. 用[]替換list()

建立列表的最簡潔和 Pythonic 的方法是使用 []。

  1. x = []

  2. x = ['first', 'second']

這樣作有額外的優勢:是一個很好的改進程序性能的方法。

如下是更改以前和以後的時間對比:

  1. $ python3 -m timeit "x = list()"

  2. 5000000 loops, best of 5: 63.3 nsec per loop

 

  1. $ python3 -m timeit "x = []"

  2. 20000000 loops, best of 5: 15.8 nsec per loop

一樣的緣由和性能表現,使用{}替代dict()。

6. 將重複執行的語句移出for/while循環

將「不變的」語句從循環中移出。若是某條語句只是設置了一些變量供循環使用,則不須要在循環中。循環自己就是複雜的,所以在編寫循環時,應牢記,使其更短、更容易理解。

在此示例中,city變量在循環中賦值,但它只讀取且不更改。

  1. for building in buildings:

  2. city = 'London'

  3. addresses.append(building.street_address, city)

所以,將其移出是安全的,這更清楚地說明,相同的city值將應用於每一個building變量。

  1. city = 'London'

  2. for building in buildings:

  3. addresses.append(building.street_address, city)

這也是提升了程序性能 ,由於若是循環中的任何語句將在每次循環運行時執行。在這些屢次執行上花費的時間屬於浪費,由於它只須要執行一次。若是語句涉及對數據庫的調用或其餘耗時的任務,則這種節省可能很是重要。

 

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理想要獲取更多Python學習資料能夠加QQ:2955637827私聊或加Q羣630390733你們一塊兒來學習討論吧!

相關文章
相關標籤/搜索