天天看點

《Python資料科學指南》——1.15 使用裝飾器改變函數行為

本節書摘來自異步社群《python資料科學指南》一書中的第1章,第1.15節,作者[印度] gopi subramanian ,方延風 劉丹 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

裝飾器能封裝一個函數,并改變它的行為,通過示例是了解它們的最好方式,本節中我們示範了實際應用中的一些示例。

還記得我們在前面章節中将函數作為另一個函數的參數、函數作為一個變量、函數中傳回函數等介紹嗎?最重要的是,你還記得那個圓柱體的例子嗎?如果你掌握了這些,裝飾器隻是小菜一碟。在本節的示例中,我們将對給定的字元串建立清理操作管道:給定一個混合大小寫并帶有标點符号的字元串,我們使用裝飾器對它進行清理,這些操作還很容易進行擴充。

我們寫一個簡單的裝飾器來進行文本操作。

我們先從以下兩行開始。

我們聲明了一個字元串變量,然後想對它進行清理,使之滿足以下特性。

将字元串轉為小寫。

清除标點符号。

傳回一個詞清單。

我們用字元串s作為參數,調用了tokenize_whitespace函數,我們來看看這個函數。

這個函數很簡單:輸入一個字元串,函數采用空格作為分隔符将它進行分割,并傳回一個詞清單。接下來我們使用裝飾器來改變這個函數的行為,這個裝飾器就是@pipeline_wrapper,它是以簡便的方式調用以下語句。

<code>tokenize_whitespace = pipeline_wrapper (clean_tokens)</code>

我們仔細看看這個裝飾器函數。

pipeline_wrapper傳回了wrapper函數,在後者中,最後的傳回語句是傳回func,這是我們傳遞給wrapper的原始函數,wrapper改變了我們原來的pipeline_wrapper函數的行為。pipeline_wrapper的輸入先被to_lower()函數修改了,轉成了小寫。随後是remove_punc()函數,将标點符号清除。最後的輸出如下。

<code>['string', 'with', 'punctuation']</code>

以上結果就是我們所要的:清除标點符号,轉為小寫字元,最後形式是詞的清單。