給Python函數執行前後添加額外行為
以前想在函數前後添點啥額外功能(比如過濾、計時等)時,總是首先想到裝飾器。比如這個計量所花費時間的程序:
from functools import wraps, partialnfrom time import timenndef timing(func=None, frequencies=1):n if func is None:n # print("+None")n return partial(timing, frequencies=frequencies)n # else:n # print("-None")nn @wraps(func)n def _wrapper(*args, **kwargs):n start_time = time()n for t in range(frequencies):n result = func(*args, **kwargs)n end_time = time()n print(運行花費時間:{:.6f}s。.format(end_time-start_time))n return resultnn return _wrappernnn@timingndef run():n l = []n for i in range(5000000):n l.extend([i])n return len(l)n
運行如下:
In [4]: run()n運行花費時間:2.383398s。nOut[4]: 5000000n
(喜歡刨根問底的可以去掉注釋,並思考預計會有什麼樣的輸出)。
今天無意間看到了Python的上下文管理器(Context Manager),發現也非常不錯,其實這跟with語句是息息相關的,竟然以前一直未在意。
from time import timenndef run2():n l = []n for i in range(5000000):n l.extend([i])n return len(l)nnclass ElapsedTime():n def __enter__(self):n self.start_time = time()n return selfnn def __exit__(self, exception_type, exception_value, traceback):n self.end_time = time()n print(運行花費時間:{:.6f}s。.format(self.end_time - self.start_time))nnwith ElapsedTime():n run2()n
初略看了一點官方文檔,上下文管理還是有點多內容的。Python發展到現在,其實不簡單了。說簡單,只是你自己不夠與時俱進,掌握的都是老式三板斧而已。所以,知識需要不斷更新,才能彌補自己的盲點,這是我最想說的。
後續再找時間好好探究一番。
我的個人博客:http://www.2gua.info/
推薦閱讀:
※Python小白想爬取網路數據?
※基於Tor網路的多ip爬蟲
※左手用R右手Python系列11——相關性分析
※為什麼說浮點數缺乏精確性? python中浮點數運算問題
TAG:Python |