为一组字符筛选字符串

2024-10-01 02:39:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这是从“Python食谱”,但没有解释清楚。在

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')

我的问题是,过滤器是如何作为参数传入的?在


Tags: stringreturnifdeftranslatejustprintkeep
2条回答

makefilter返回函数。在

在示例代码中:

just_vowels = makefilter('aeiou')

变量just_vowels现在引用基于thefilter的函数。在

代码:

^{pr2}$

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

使用列表理解或生成器表达式可以简化食谱代码:

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

这将以与提供的makefilter相同的方式工作。在

^{pr2}$

以后会动态地创建一个函数,比如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'

相关问题 更多 >