2010-09-29 142 views
0

這是來自'python cookbook',但沒有解釋得很好。爲一組字符過濾字符串

allchars = string.maketrans('','') 
def makefilter(keep): 
    delchars = allchars.translate(allchars, keep) 
    def thefilter(s): 
     return s.translate(allchars,delchars) 
    return thefilter 

if __name__ == '__main__': 
    just_vowels = makefilter('aeiou') 
    print just_vowels('four score and seven years ago') 

    print just_vowels('tigere, igers, bigers') 

我的問題是,過濾器的'如何作爲參數傳入?

回答

2

makefilter返回一個函數。

在該示例代碼:

just_vowels = makefilter('aeiou') 

可變just_vowels現在是指基於thefilter的功能。

代碼:

print just_vowels('tigere, igers, bigers') 

正在調用的功能,其s參數設置爲字符串​​。

+0

ahhh ...所以該過濾器不運行在初始的makerfilter。它等待稍後被調用... – shawn 2010-09-29 15:14:31

+0

正確。 'makefilter'正在創建一個「閉包」,它是一個函數,「稍後等待被調用」,並且還帶有它在創建時獲得的一些狀態(在這種情況下爲'delchars' )。 – RichieHindle 2010-09-29 15:18:16

2

它能夠簡化使用列表理解或發電機表達式食譜代碼:

def make_filter(keep): 
    def the_filter(string): 
     return ''.join(char for char in string if char in keep) 
    return the_filter 

這將工作相同的方式提供makefilter。

>>> just_vowels = make_filter('aeiou') 
>>> just_vowels('four score and seven years ago') 
'ouoeaeeeaao' 
>>> just_vowels('tigere, igers, bigers') 
'ieeieie' 

Like Richie解釋說,它會動態地創建一個函數,您可以稍後調用一個字符串。 (char for char in string if char in keep)位代碼創建一個生成器,它將遍歷原始字符串的字符並執行過濾。 ''.join(...)然後將這些字符組合成一個字符串。個人而言,我發現抽象層次(寫一個函數來返回一個函數)對於這類問題是過分的。這是一個味道的問題,但我認爲你的代碼會更清晰,如果你只是直接調用顯着行:

>>> string = 'tigere, igers, bigers' 
>>> keep = 'aeiou' 
>>> ''.join(char for char in string if char in keep) 
'ieeieie' 
+0

+1用於重寫食譜今天的樣子。 – delnan 2010-09-29 16:31:33

+0

你真的不應該在這個例子中使用關鍵字... '''.join(x代表input_string,如果x保持)' – travc 2013-08-13 07:43:02