过滤一组字符的字符串

时间:2010-09-29 15:04:26

标签: python

这是来自'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 个答案:

答案 0 :(得分:2)

makefilter返回一个函数。

在示例代码中:

just_vowels = makefilter('aeiou')

变量just_vowels现在指的是基于thefilter的函数。

代码:

print just_vowels('tigere, igers, bigers')

正在调用该函数,并将其s参数设置为字符串'tigere, igers, bigers'

答案 1 :(得分: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'

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'