天天看點

《Python Cookbook(第2版)中文版》——1.9 台灣字元串的translate方法的使用

本節書摘來自異步社群《python cookbook(第2版)中文版》一書中的第1章,第1.9節,作者[美]alex martelli , anna martelli ravenscrof , david ascher ,高鐵軍 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

任務

用字元串的translate方法來進行快速編碼,但卻發現很難記住這個方法和string.maketrans函數的應用細節,是以需要對它們做個簡單的封裝,以簡化其使用流程。

解決方案

字元串的translate方法非常強大而靈活,具體細節可參考第1.10節。正因為它的威力和靈活性,将它“包裝”起來以簡化應用就成了個好主意。一個傳回閉包的工廠函數可以很好地完成這種任務:

讨論

我經常發現我有使用字元串的translate方法的需求,但每次我都得停下來回想它的用法細節(見第1.10節提供的更多細節資訊)。是以,我幹脆給自己寫了個類(後來改寫成了本節中展示的工廠閉包的形式),把各種可能性封閉在一個簡單易用的接口後面。現在,如果我需要一個函數來選出屬于指定集合的字元,我就可以簡單地建立并使用它:

移除屬于某字元集合的元素也同樣簡單:

甚至,我可以用某個字元替換屬于某指定集合的字元:

雖然後面那個應用顯得有點特殊,但我仍然不時地碰到有這種需求的任務。

當然,我的設計有點武斷,當delete參數和keep參數有重疊部分的時候,我讓delete參數優先:

對于你的程式,如果keep被指定了,可能忽略掉delete會更好一些,再或者,如果兩者都被指定了,抛出個異常也不錯,因為在一個對translator的調用中同時指定兩者可能沒什麼意義。另外,和第1.8節和第1.10節相似,本節代碼隻适用于普通字元串,對unicode字元串并不适用。參看第1.10節,可以了解到怎樣為unicode字元串編寫類似功能的代碼,并可看到unicode的translate方法與普通(單位元組)字元串的translate的差別。

閉包 閉包(closure)不是什麼複雜得不得了的東西:它隻不過是個“内層”的函數,由一個名字(變量)來指代,而這個名字(變量)對于“外層”包含它的函數而言,是本地變量。我們用一個教科書般的例子來說明: def make_adder(addend): def adder(augend): return augend+addend return adder 執行p = make_addr(23)将産生内層函數adder的一個閉包,這個閉包在内部引用了名字addend,而addend又綁定到數值23。q = make_adder(42)又産生另一個閉包,這次名字addend則綁定到了值42。q和p互相之間并無關聯,是以它們可以互相獨立地和諧共存。現在我們就可以執行它們了,比如,print p(100), q(100)将列印出123 142。 實際上,我們一般認為make_adder指向一個閉包,而不是說什麼迂腐拗口的“一個傳回閉包的函數”—幸運的是,根據上下文環境,通常這樣也不至于造成誤解。稱make_adder為一個工廠(或者工廠函數)也是簡潔明确的;還可以稱它為一個閉包工廠來強調它建立并傳回閉包,而不是傳回類或者類的執行個體。