標籤:

給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發展到現在,其實不簡單了。說簡單,只是你自己不夠與時俱進,掌握的都是老式三板斧而已。所以,知識需要不斷更新,才能彌補自己的盲點,這是我最想說的。

後續再找時間好好探究一番。

我的個人博客:2gua.info/

推薦閱讀:

Python小白想爬取網路數據?
基於Tor網路的多ip爬蟲
左手用R右手Python系列11——相關性分析
為什麼說浮點數缺乏精確性? python中浮點數運算問題

TAG:Python |