一些Python的慣用法和小技巧:Pythonic

Pythonic實際上是個模糊的含義,沒有肯定的解釋。網上也沒有過多關於Pythonic的說明,我我的的理解是更加Python,更符合Python的行爲習慣。本文主要是說明一些Python的慣用法和小技巧,其實與上一篇《編碼規範》有殊途同歸之妙,都是爲了增長代碼可讀性,但Pythonic可能還會從性能的角度進行考慮。

首先是兩個不得不說的Python的特性List Comprehension和Generator Expression,很是精簡的語法,很大程度上取代了冗長for循環。

1. 列表解析(List Comprehension)List Comprehension是在Python2.0版本中加進入的,是一種更高效、簡潔的for結構替代品,做爲新手寫上幾個後就對它愛不釋手,驚呼太好用了。

例子:將原始列表中的全部元素進行某種操做後賦值給新的列表。

若是用for循環,代碼以下:

oldlist = [] 

for item in oldlist: 

newlist.append(func(item))

若是使用List Comprehension,代碼以下:

newlist = [func(item) for item in oldlist]

咱們明顯看到差異,3行變一行,代碼可讀性加強,並且性能也提高不少,聽說基本能夠達到c語言的速度。

List Comprehension還支持過濾功能,在列表生成過程當中套用for if字句,很是好用。示例以下:

evens = [even for even in range(10) if even % 2 == 0]

只須要一行,就將獲得0到9的數字中的全部偶數,過濾掉了奇數。

2. 生成器表達式(Generator Expression):Python2.4中引入了Generator Expression。它功能上相似於List Comprehension,這你就要問了,爲何要加入這個呢。由於Generator Expression更加高效,避免了生成整個列表,改善性能及內存佔用,取而代之的是返回一個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中的亮點,簡潔高效,必定要常常用、時時用、秒秒用。

而後是一些小技巧(大多數是不少語言都提倡的編程實踐):

1. 字符串拼接:使用’’.join進行字符串拼接,而不是a += b這種形式。由於join將保證這個過程的時間複雜度爲線性的,效率更高。道理不少人都知道,可是大多數人仍是喜歡用「+」,由於這個實在太簡潔了。其實不少語言都提供了拼接字符串的方法或者相應的類,良好編程習慣從拼接字符串開始。

2. 異常類型:基於類的異常老是好過基於字符串的異常。咱們最好構造一個基於Exception的子類。

當拋出一個異常的時候,使用」raise ValueError(‘message’)」替代」raise ValueError, ’message’」的形式。

3. None判斷:判斷一個實例變量是否爲空的時候,應該老是用’is’或者’is not’,而不要使用相等操做符。

4. 對象類型判斷:對象類型的比較應該始終用isinstance()代替直接比較類型。例如:

使用if isinstance(obj, int): 而不是 if type(obj) is type(1):

5. 字符串先後綴判斷:在檢查前綴或後綴時避免對字符串進行切片。用startswith()和endswith()代替,由於它們是明確的而且錯誤更少。例如:

使用if foo.startswith('bar'): 替代 if foo[:3] == 'bar':

6. 變量值交換:在其餘語言中,咱們常常這樣交換兩個變量的值。t=a; a=b; b=t;

可是在Python中,咱們還有一個簡單的辦法,a, b = b, a,而且這種方法更快,更酷。web

相關文章
相關標籤/搜索