2015-04-23 43 views
3

我可以在Python中使用“静态”变量的匿名函数吗?我可以在Python中使用“静态”变量的匿名函数吗?

例如

lambda x: re.compile(r'foobar').match(x) 

没有那么大,因为它可能会重新编译每次调用时间(如果re用完缓存 - 谢谢你响应者指出了缓存机制)。

我可以做到这一点无需重新编译:

def f(line): 
    try: 
     f.c 
    except: 
     f.c = re.compile(r'foobar') 
    return f.c.match(line) 

如何用拉姆达做到这一点,而无需重新编译?

嗯,我不想使用帮助函数,在lambda内部使用。使用lambdas的全部观点是“匿名”。所以是的,lambda是匿名的,并且是独立的。

+1

're'库有一个缓存机制,所以每次调用函数时都不应该编译正则表达式。 –

+1

实际上我不会为此担心。 're'模块内部缓存了100个正则表达式,所以如果你使用的模式不超过100个,那么执行此操作时不会看到任何显着的性能增益 – wim

+2

为什么第二个示例不会重新编译? – hitzg

回答

8

通常的技巧是为您不打算提供的参数提供默认值。

lambda x, regexobject=re.compile(r'foobar'): regexobject.match(x) 

当定义了lambda而不是每次调用时都会计算默认值。


而不是使用lambda,不过,我只想确定你的正则表达式明确

regex1 = re.compile(r'foobar') 
regex2 = re.compile(r'bazquux') 
# etc 

然后绕过在需要绑定的方法。也就是说,不是

somefunction(lambda x, regexobject=re.compile(r'foobar'): regexobject.match(x)) 

使用

somefunction(regex1.match) 

的使用情况的匿名函数是一个只会被调用一次,所以在一个名称绑定到它没有任何意义。您担心多次调用re.compile这一事实表明这些函数将被多次调用。

+0

这很漂亮。谢谢!! –

+0

对于仅使用绑定方法的建议+1。我觉得在这里尝试应用lambdas没有任何好处 – wim

相关问题