这是来自'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')
我的问题是,过滤器的'如何作为参数传递?
答案 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'