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