使用Python來編寫也有很長一段時間了,也想着如何優化本身的代碼,隨之也搜了一些問題。
其中印象比較深入的就是stackoverflow上的一個問題解答了。python
Argument Unpackingexpress
可使用 * 和 ** 分別將一個列表和一個字典解包爲函數參數如:app
def draw_point(x, y): # do something tuple = (6, 8) dir = {'x': 6, 'y': 8} draw_point(*tuple) draw_point(**dir)
Decorators 函數
裝飾器的做用就是在不須要修改原函數代碼的前提下增長新的功能,在調用原函數的時候先執行裝飾器,如:優化
def print_before_func(func): def wrapper(*args, **kwargs): print("print before func") return func(*args, **kwargs) return wrapper @print_befor_func def write(text): print(text) write(Hello world) 結果: print before func Hello world
Dictionary default .get value this
字典中有一個get()
方法。若是你使用dict['key']
的方式而key
不存在的話就會出現異常。使用dict.get('key')
的話若是key
不存在則只會返回None
。固然get()
方法提供了第二個參數,若是返回None
則會返回第二個參數的值。code
num = dict.get('num', 0)
Enumeration
使用enumeration包住一個可迭代對象,它會將index和item綁在一塊兒,返回一個enumeration對象,如:orm
a = ['a', 'b', 'c', 'd'] for index, item in enumeration(a): print(index, item) ··· 0 a 1 b 2 c 3 d ···
在同時須要索引和值的時候頗有用對象
For/else
語法以下:blog
for i in foo: if i == 0: break else: print("it was never 0")
else
代碼塊會在循環正常結束後執行,也就是說沒用出現break
時纔會調用else
代碼塊,上面代碼等價於:
found = False for i in foo: if i == 0: found = True break if not found: print("it was never 0")
這個語法挺容易讓人混淆的,全部在使用的時候最好是註釋一下,以避免被其餘小夥伴搞錯含義了。
上面的代碼也等價於:
if any(i == 0 for i in foo): pass else: print("it was never 0")
Generator expressions
假如你這樣寫:
x = (n for n in foo if bar(n))
你將會獲得一個生成器,並能夠把它付給一個變量x。如今你能夠像下面同樣使用生成器:
for n in x: print(n)
這樣作的好處就是節省內存了。你不須要中間存儲,而若是像下面這樣的話,則須要:
x = [n for n in foo if bar(n)] # 列表推導
在某些狀況下,這會致使極重要的速度提高。
你能夠添加許多if語句到生成器的尾端,基本複製for循環嵌套:
>>> n = ((a,b) for a in range(0,2) for b in range(4,6)) >>> for i in n: ... print i (0, 4) (0, 5) (1, 4) (1, 5)
使用生成器最大的好處就是節省內存了。由於每個值只有在你須要的時候纔會生成,而不像列表推導那樣一次性生成全部的結果。
List stepping
切片操做符中的步長(step)參數。例如:
a = [1,2,3,4,5] >>> a[::2] # iterate over the whole list in 2-increments [1,3,5]
特殊例子x[::-1]
對‘x反轉’來講至關有用。
>>> a[::-1] [5,4,3,2,1]
固然,你可使用reversed()
函數來實現反轉。
區別在於,reversed()返回一個迭代器,因此還須要一個額外的步驟來將結果轉換成須要的對象類型。
這個特性在判斷例如迴文的時候灰常有用,一句話搞定
True if someseq == someseq[::-1] else False
Named string formatting
%-格式化接收一個字典(也適用於%i%s等)
>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42} The answer is 42.
try/except/else
else語句塊只有當try語句正常執行(也就是說,except語句未執行)的時候,纔會執行。
finally則不管是否異常都會執行。
try: Normal execution block except A: Exception A handle except B: Exception B handle except: Other exception handle else: if no exception,get here finally: this block will be excuted no matter how it goes above