Python 實用技巧(上)

劉志軍發表於2013-10-27

本文根據SO上的熱門問答hidden features of python整理而成,早期有人做過類似的整理,但是內容比較舊而且比較粗糙,因此筆者在原文基礎上加入自己的一些理解,另外那些高質量的評論也引入進來了。總之,這是一篇用心之作,希望你可以喜歡。

鏈式比較操作

你可能認為它執行的過程先是:1 < x,返回True,然後再比較True < 10,當然這麼做也是返回True,比較表示式True < 10,因為直譯器會把True轉換成1False轉換成0。但這裡的鏈式比較直譯器在內部並不是這樣乾的,它會把這種鏈式的比較操作轉換成:1 < x and x < 10,不信你可以看看最後一個例子。這樣的鏈式操作本可以值得所有程式語言擁有,但是很遺憾

 

列舉

用enumerate包裝一個可迭代物件,可以同時使用迭代項和索引,如果你不這麼幹的話,下面有一種比較麻煩的方法:

enumerate 還可以接收一個可選引數start,預設start等於0。enumerate(list, start=1),這樣index的起始值就是1

 

生成器物件

你可以把生成器物件賦值給x,意味著可以對x進行迭代操作:

它的好處就是不需要儲存中間結果,也許你會使用(列表推倒式):

它比生成器物件能帶來更快的速度。相對地,生成器更能節省記憶體開銷,它的值是按需生成,不需要像列表推倒式一樣把整個結果儲存在記憶體中,同時它不能重新迭代,列表推倒式則不然。

 

iter()可接收callable引數

iter()內建函式接收的引數分為兩種,第一種是:

引數collection必須是可迭代物件或者是序列 ,第二種是:

callable函式會一直被呼叫,直到它的返回結果等於sentinel,例如:

小心可變的預設引數

取而代之的是你應該使用一個標記值表示“沒有指定”來替換可變值,如:

 

傳送值到生成器函式在中

你可以:

如果你不喜歡使用空格縮排,那麼可以使用C語言花括號{}定義函式:

當然這僅僅是一個玩笑,想用花括號定義函式?沒門。感興趣的還可以瞭解下:

不過這是python3裡面的特性,http://www.python.org/dev/peps/pep-0401/

 

切片操作中的步長引數

還有一個特例:x[::-1],反轉列表:

有關反轉,還有兩個函式reverse、reversed,reverse是list物件的方法,沒有返回值,而reversed是內建方法,可接收的引數包括tuple、string、list、unicode,以及使用者自定義的型別,返回一個迭代器。

 

裝飾器

裝飾器使一個函式或方法包裝在另一個函式裡頭,可以在被包裝的函式新增一些額外的功能,比如日誌,還可以對引數、返回結果進行修改。裝飾器有點類似Java中的AOP。下面這個例子是列印被裝飾的函式裡面的引數的裝飾器,

@是語法糖,它等價於:

 

for … else語法

else程式碼塊會在for迴圈正常結束後執行,除非遇到break(就不會執行),它等價於下面:

不過這種語法看起來怪怪地,讓人感覺是else塊是在for語句塊沒有執行的時候執行的,很容易讓人去類比 if else 的語法,如果是把else換成finally或許更容易理解

 

python2.5有個__missing__方法

dict的子類如果定義了方法__missing__(self, key),如果key不再dict中,那麼d[key]就會呼叫__missing__方法,而且d[key]的返回值就是__missing__的返回值。

在collections模組下有一個叫defaultdict的dict子類,它與missing非常類似,但是對於不存在的項不需要傳遞引數。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

Python 實用技巧(上)

相關文章