天天看點

《Python Cookbook(第2版)中文版》——1.19 檢查字元串中的結束标記

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

任務

給定一個字元串s,你想檢查s中是否含有多個結束标記中的一個。需要一種快捷、優雅的方式,來替換掉s.endswith(end1)、s.endswith(end2)或s.endswith(end3)之類的笨重用法。

解決方案

對于類似于本節的問題,itertools.imap給出了一種快速友善的解決辦法:

讨論

一個典型的endswith應用是列印出目前目錄中所有的圖檔檔案:

本節解決方案中給出的思想可以很容易地應用到其他類似的檢查任務中去。輔助函數anytrue是一個通用而快速的函數,可以給它傳入其他的被綁定方法(bound method)作為第一個參數,比如s.startswith或s. _contains _。事實上,不使用輔助函數而直接編碼也許更好:

我認為它的可讀性也沒什麼問題。

被綁定方法(bound method) 如果一個python對象提供一個方法,可以直接獲得一個已經綁定到該對象的方法,進而直接使用此方法。(比如,可以将其指派給别的對象、将它作為一個參數傳遞、或者在一個函數中直接傳回它,等等。)舉個例子: l = ['fee', 'fie', 'foo'] x = l.append 現在x指向了清單對象l的一個被綁定方法。調用x,比如x(‘fum’),和調用l.append(‘fum’)是完全等價的:結果都是對象l變成了['fee', 'fie', 'foo', 'fum']。 如果通路的是一個類型或者一個類的方法,而不是一個類型或者類的執行個體的方法,你得到的是一個非綁定方法,該方法并未“依附”于此類型或者類的任何一個執行個體:當調用它時,需要提供該類型或類的一個執行個體作為第一個參數。比如,如果設定y = list.append,你不能直接調用y(‘i’),因為python猜不出你想給哪個清單對象添加一個i。可以調用y(l,’i’),這和調用l.append(‘i’)效果完全一樣(隻要isinstance(l,list)成立)。

本節的解決方案和想法來源于news:comp.lang.python的一個讨論,并綜合和概括了很多人的觀點,包括了raymond hettinger、chris perkins、bengt richter等。