1. 合併嵌套的 if 條件html
太多的嵌套會使代碼難以理解,這在 Python 中尤其如此,由於 Python 沒有括號來幫助區隔不一樣的嵌套級別。python
閱讀深度嵌套的代碼容易讓人煩躁,由於你必須理清哪些條件屬於哪一級。所以,咱們應儘量減小嵌套,若是兩個條件能夠用 and 合在一塊兒,會比嵌套更易讀。數據庫
合併以前:安全
if a:
網絡
if b:
app
return c
函數
合併後:oop
if a and b:
性能
return c
學習
2. 將重複的代碼移到條件語句以外
咱們應該始終尋找移除重複代碼的方法。這是提高代碼能力的好辦法。
有時,在條件的兩個分支上出現重複代碼,這意味這段代碼將始終執行。所以這段重複的代碼能夠從條件中移出,放在條件以外執行。
if sold > DISCOUNT_AMOUNT:
total = sold * DISCOUNT_PRICE
label = f'Total: {total}'
else:
total = sold * PRICE
label = f'Total: {total}'
經過將對label變量賦值移到到條件以外,咱們刪除了重複的代碼行,並明確了條件實際控制的內容,就是計算total。
if sold > DISCOUNT_AMOUNT:
total = sold * DISCOUNT_PRICE
else:
total = sold * PRICE
label = f'Total: {total}'
3. 將內部循環中的yield替換爲yield from
常常忽略的一個小竅門是 Python 的yield關鍵字有對應的爲collections準備的yield from。所以無需使用 for 循環遍歷集合。這使代碼變短,並刪除 for 中的額外變量。並且消除 for 循環後,yield from使程序運行效率提升約 15%。
重構前:
def get_content(entry):
for block in entry.get_blocks():
yield block
重構後:
def get_content(entry):
yield from entry.get_blocks()
4. 使用 any() 而不是用於循環
常見的模式是,咱們須要查找是否集合中的一個或多個項符合某些條件。這能夠經過 for 循環完成,例如:
found = False
for thing in things:
if thing == other_thing:
found = True
break
更簡潔的方法,是使用 Python 的 any() 和 all()內置函數,來清楚地顯示代碼的意圖。
當至少有一個元素計算爲 True 時,all() 將返回 True,只有當全部元素都計算爲 True 時,all() 將返回 True。
若是對 any() 的調用找到一個值值爲 True 的元素,它能夠當即返回。
5. 用[]替換list()
建立列表的最簡潔和 Pythonic 的方法是使用 []。
x = []
x = ['first', 'second']
這樣作有額外的優勢:是一個很好的改進程序性能的方法。
如下是更改以前和以後的時間對比:
$ python3 -m timeit "x = list()"
5000000 loops, best of 5: 63.3 nsec per loop
$ python3 -m timeit "x = []"
20000000 loops, best of 5: 15.8 nsec per loop
一樣的緣由和性能表現,使用{}替代dict()。
6. 將重複執行的語句移出for/while循環
將「不變的」語句從循環中移出。若是某條語句只是設置了一些變量供循環使用,則不須要在循環中。循環自己就是複雜的,所以在編寫循環時,應牢記,使其更短、更容易理解。
在此示例中,city變量在循環中賦值,但它只讀取且不更改。
for building in buildings:
city = 'London'
addresses.append(building.street_address, city)
所以,將其移出是安全的,這更清楚地說明,相同的city值將應用於每一個building變量。
city = 'London'
for building in buildings:
addresses.append(building.street_address, city)
這也是提升了程序性能 ,由於若是循環中的任何語句將在每次循環運行時執行。在這些屢次執行上花費的時間屬於浪費,由於它只須要執行一次。若是語句涉及對數據庫的調用或其餘耗時的任務,則這種節省可能很是重要。
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理想要獲取更多Python學習資料能夠加QQ:2955637827私聊或加Q羣630390733你們一塊兒來學習討論吧!