我希望早點就知道的10個Python用法

Daetalus發表於2014-12-30

我一輩子都在寫程式碼,但從來沒有掌握編碼的精髓。大部分情況下使用Visual Basic,因為我用VB最舒服。同時還略微瞭解一點其他語言(R、C、JavaScript、Applescript、Hypertext和1979年學習的BASIC)。幾年前,我決定只用Python,以此來提高我的編碼能力。在此過程中重複發明了許多輪子,但我並不介意,因為我享受解決問題的樂趣。同時有時能發現更有效、Python式的解決方案。時間長了以後,會有頓悟的時刻,意識到根本沒必要用困難且冗長的方式處理問題。下面列出10條Python用法,如果我早點發現,也許能節省很多時間。

這裡沒有列表推導和lambda函式。雖然這兩個用法都是Python式的,效率高也非常酷,但由於經常在StackOverflow或其他地方碰到,所以學Python的應該都知道這兩個東西。同時也沒有三元運算子、裝飾器和生成器,因為我很少用到。

本文還有一個IPython notebook nbviewer版本。

1. 在Python 2中使用Python 3式的輸出

Python 2與Python 3不相容,這讓我不知道該選擇哪個版本的Python。最終我選擇了Python 2,因為當時許多我需要用的庫都與Python 3不相容。

但實際上,日常使用中最大的版本差異是輸出(print)和除法行為。現在我在Python 2的程式碼中都用import from future來匯入Python 3的輸出和除法。現在我用到的幾乎所有庫都支援Python 3,因此會很快遷移到Python 3中。

對了,對於C系的那些更喜歡括號而不是縮排的開發者,這裡還有一個彩蛋:

2. enumerate(list)

很明顯,迭代列表時,應該同時迭代其中的元素及其索引,但在很長一段時間內,我都尷尬的使用計數變數或切片。

3. 鏈式比較操作符

由於我以前使用的是靜態語言(在這些語言中該用法有二義性),從來沒有將兩個比較操作符放在一個表示式中。在許多語言中,4 > 3 > 2會返回False,因為4 > 3的結果是布林值,而True > 2將得出False。

4. collections.Counter

Python的集合庫看上去是最好的。在計算需要集合中元素的個數時,StackOverflow找到的答案是建立有序字典,但我堅持使用一個程式碼片段來建立字典,計算結果中元素出現的頻率。直到有一天,我發現可以用collections.deque。

5. 字典推導

Python開發者的一個重要標誌就是理解列表推導,但最終我發現字典推導也很有用,特別是在交換字典的鍵和值的時候。

6. 用subprocess執行shell命令

以前,我使用os庫呼叫外部命令處理檔案,而現在我可以在Python中以編碼的方式執行諸如ffmpeg這樣的複雜命令進行視訊編輯。

(是的,我和我的客戶都使用Windows,如果你們因此鄙視我,我會大方地接受!)

注意,用os庫完成這個特定命令比用subprocess更好。我只想有一個大家都熟悉的命令。同時,一般來說,在subprocess中使用shell=True引數是非常糟糕的主意,在這裡使用這個引數僅僅是為了能在一個IPython notebook單元中放置命令的輸出。不要自己使用這個引數!

7. 字典的.get()和.iteritems()方法

字典的get()方法可以設定預設值,當用get()查詢的鍵不存在時,返回方法中的預設值引數是很有用的。與列表中的enumerate()相同,可以用鍵值元組迭代字典中的元素。

8. 用於交換元素的元組解包

在VB中,每當需要交換兩個變數時,都要用要一個愚蠢的臨時變數:c = a; a = b; b = c

9. 內省工具Introspection tools

我知道dir()方法,我本以為help()方法和IPython中的?魔法命令是一樣的,但help()的功能更強大。

10. PEP-8相容的字串連線

PEP8是Python編碼樣式指南。撇開其他的不看,PEP8要求每行不能超過80個字元,超過的部分要換行並縮排。

可以通過反斜槓、帶逗號“,”的圓括號“()”、或者額外的加號“+”來完成換行。但對於多行字串,這些解決方案都不夠優雅。Python有個多行字串記號,即三個引號,但這樣無法換行後保持縮排。

還有一個方法,那就是不帶逗號的圓括號。我不知道為什麼這種方式能工作,但能用就行。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

我希望早點就知道的10個Python用法 我希望早點就知道的10個Python用法

相關文章