首先是兩個不得不說的Python的特性List Comprehension和Generator Expression,非常精簡的語法,很大程度上取代了冗長for循環(huán)。
1. 列表解析(List Comprehension)List Comprehension是在Python2.0版本中加進入的,是一種更高效、簡潔的for結(jié)構(gòu)替代品,作為新手寫上幾個后就對它愛不釋手,驚呼太好用了。
例子:將原始列表中的所有元素進行某種操作后賦值給新的列表。
如果用for循環(huán),代碼如下:
oldlist = []
for item in oldlist:
newlist.append(func(item))
如果使用List Comprehension,代碼如下:
newlist = [func(item) for item in oldlist]
我們明顯看到差別,3行變一行,代碼可讀性增強,而且性能也提升很多,據(jù)說基本可以達到C語言的速度。
List Comprehension還支持過濾功能,在列表生成過程中套用for if字句,非常好用。示例如下:
evens = [even for even in range(10) if even % 2 == 0]
只需要一行,就將得到0到9的數(shù)字中的所有偶數(shù),過濾掉了奇數(shù)。
2. 生成器表達式(Generator Expression):Python2.4中引入了Generator Expression。它功能上類似于List Comprehension,這你就要問了,為什么要加入這個呢。因為Generator Expression更加高效,避免了生成整個列表,改善性能及內(nèi)存占用,取而代之的是返回一個generator object,通過它迭代的返回列表中的每一個值。
而且Generator Expression的使用方法也很簡單,就是將List Comprehension中的中括號[]改成小括號(),示例如下:
newlist = (func(item) for item in oldlist)
這個返回的newlist其實并不是一個list,而是前面提到的generator object,可以理解為列表的一個迭代器,類似于C++中的iter。 可以通過newlist.next()迭代獲得列表中的每一項。
List Comprehension和Generator Expression實在是Python中的亮點,簡潔高效,一定要經(jīng)常用、時時用、秒秒用。
然后是一些小技巧(大多數(shù)是很多語言都提倡的編程實踐):
1. 字符串拼接:使用’’.join進行字符串拼接,而不是a += b這種形式。因為join將保證這個過程的時間復雜度為線性的,效率更高。道理很多人都知道,但是大多數(shù)人還是喜歡用“+”,因為這個實在太簡潔了。其實很多語言都提供了拼接字符串的方法或者相應(yīng)的類,良好編程習慣從拼接字符串開始。
2. 異常類型:基于類的異常總是好過基于字符串的異常。我們最好構(gòu)造一個基于Exception的子類。
當拋出一個異常的時候,使用”raise ValueError(‘message’)”替代”raise ValueError, ’message’”的形式。
3. None判斷:判斷一個實例變量是否為空的時候,應(yīng)該總是用’is’或者’is not’,而不要使用相等操作符。
4. 對象類型判斷:對象類型的比較應(yīng)該始終用isinstance()代替直接比較類型。例如:
使用if isinstance(obj, int): 而不是 if type(obj) is type(1):
5. 字符串前后綴判斷:在檢查前綴或后綴時避免對字符串進行切片。用startswith()和endswith()代替,因為它們是明確的并且錯誤更少。例如:
使用if foo.startswith('bar'): 替代 if foo[:3] == 'bar':
6. 變量值交換:在其他語言中,我們經(jīng)常這樣交換兩個變量的值。t=a; a=b; b=t;
但是在Python中,我們還有一個簡單的辦法,a, b = b, a,并且這種方法更快,更酷。