當前位置:
首頁 > 最新 > 漲姿勢!這些小技巧讓小白也可以寫出更優雅的Python代碼!

漲姿勢!這些小技巧讓小白也可以寫出更優雅的Python代碼!

一、前言

我前兩天回答了兩個Python相關的問題,收到了很多贊,從答案被收藏的情況來看,確實對不少人都很有幫助,所以我也很開心。我今天準備把這個問題認真回答一下。我會先討論什麼是優美的代碼;然後,我會給出一些我壓箱底的好東西;最後,我會討論怎麼寫出優美的代碼。

二、什麼是優美(優雅)的代碼

什麼是優美或優雅的代碼實現呢?在Python裡面,我們一般稱之為Pythonic。Pythonic並沒有一個確切的定義,一直以來都是只能意會,不能言傳的東西。為了幫助新同學理解,我對Pythonic給出了明確的定義:所謂Pythonic,就是用Python的方式寫出簡潔優美的代碼。關於Pythonic,大家可以看我個問題下的回答怎樣才能寫出pythonic的代碼?

有了Pythonic以後,不同的工程師之間,也依然無法對優美的代碼達成一致的意見。因為,美本身是一個主觀感受,每個人對美的感受是不一樣的。比如,有些人覺得湯唯更美,有些人覺得范冰冰最漂亮,還有些人居然喜歡AngelaBaby(一把年紀了叫baby你們不覺得怪嗎?)。而我,依然最喜歡劉濤。我在這篇文章中,會給出很多具體的例子,來說明怎樣寫代碼是"美"的,由於美是一種主觀感受,所以,這裡的回答可能會引起大家的爭議。

另外,在這篇回答中,我們只討論優美的Python代碼實現,並不討論Python中存在的坑。我估計Python裡面有很多坑大家都沒有注意到,比如:

對於這個坑,如果有特別感興趣的同學,可以看深入理解計算機系統(原書第2版)的第二章。

三、優美的代碼實現

在這一部分,我們會依次討論一些美的代碼。由於內容較多,所以,我進行了簡單地分類,包括: 內置函數 、Python中的一些小細節 、充分使用數據結構的便利性、 合理使用Python的高級並發工具、 巧妙使用裝飾器簡化代碼 、Python中的設計模式。這裡還是要推薦下小編的Python學習裙:『』五八八,零九零,九四二『』不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括小編自己整理的一份2018最新的Python資料和0基礎入門教程,歡迎初學和進階中的小夥伴。在不忙的時間我會給大家解惑。

3.1 善用內置函數

enumerate類

enumerate是一個類,但是用起來卻跟函數一樣方便,為了表述方便,我們後面統稱為函數。不使用enumerate可能是Python新手最容易被吐槽的地方了。enumerate其實非常簡單,接收一個可迭代對象,返回index和可迭代對象中的元素的組合。

對於Python新手,推薦使用ipython(還有bpython和ptpython,感興趣的同學也可以了解一下)互動式地測試各個函數的效果,並且,我們可以在函數後面輸入一個問號,然後回車,就能夠獲得這個函數的幫助文檔了。如下所示:

關於enumerate的效果,我們一起來看一下,你就知道為什麼不使用enumerate會被吐槽了。這是不使用enumerate的時候,列印列表中的元素和元素在列表中的位置代碼:

這是使用enumerate的Python代碼:

這是正確使用enumerate的姿勢:

去除import語句和列表的定義,實現同樣的功能,不使用enumerate需要4行代碼,使用enumerate只需要2行代碼。如果想把代碼寫得簡潔優美,那麼,大家要時刻記住:在保證代碼可讀性的前提下,代碼越少越好。顯然,使用enumerate效果就好很多。

reversed

對Python熟悉的同學知道,Python中的列表支持切片操作,可以像L[::-1]這樣去reverse列表。如下所示:

與此同時,我們也可以使用內置的reversed函數,如下所示:

我的觀點是,L[::-1]不如使用reversed好,因為,L[::-1]是一個切片操作。我們看到這個代碼的第一反應是序列切片,然後才是切片的效果是reverse列表。對於reversed函數,即使是剛接觸Python的同學,也能夠一眼看出來這個函數是要做什麼事情。也就是說,實現同樣的功能,L[::-1]比reversed多繞了一個彎。我們這個問題是如何寫出優美的代碼,而我認為,優美的代碼就應該簡潔、直接、少繞彎。 讀者如果對我這裡的解釋表示懷疑的話,我表示理解。但是,我還是想勸你認可我的說法。因為我認為,不管我們使用代碼還是文字,都是在表達某些東西。而我的表達能力,也是讀研究生以後寫論文鍛鍊出來的。就我目前比大多數人強的表達能力來說,我以我母校的榮譽保證,reversed確實比L[::-1]好。

3.2 Python中的小細節

這一節我們來看3個很小的知識點。

raise SystemExit

假設你現在要實現一個需求,在程序檢測到某種錯誤的時候,列印錯誤信息,並退出程序。在Python中,我們可以是SystemExit,如下所示:

但是,你其實可以直接這麼用的:

raise SystemExit("It failed!")

後面的這個操作會直接將信息列印到標準錯誤輸出,然後使用退出碼為1來退出程序,以表示程序沒有正常退出。

文件的x模式

大家應該知道,如果我們以w模式打開一個文件進行寫入的話,文件的內容將會被我們覆蓋掉。假設你現在有這樣一個需求:寫一個文件,如果該文件已經存在,則不寫。實現方式也很簡單,我們先判斷一下文件是否存在,如果已經存在,則列印提示信息並跳過,否則,我們就以w模式打開文件,然後寫入內容。如下所示:

如果我們使用x模式的話,代碼能夠好看很多,如下所示:

ConfigParser

上面兩個例子知道的人可能比較多,這個例子知道的人可能就不多了。在大部分服務中,會將如資料庫連接參數這樣的配置,寫到配置文件中,然後使用ConfigParser來管理。連接資料庫的時候,我們可以讀取配置參數,然後生成連接字元串。其實,ConfigParser本身就提供了生成連接字元串的功能,如下所示:

這裡給出了幾個Python中的小細節,可能很多人會覺得沒啥用,又或者大家其實已經知道了。但是,我還是把這一節放上來了,只要對一個人有用,那麼,這就是有意義的。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

關於Python和數據入門
Linux及Python入門須知

TAG:Python |