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

时间:2015-04-23 13:44:20

标签: python lambda

我可以在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进行,无需重新编译?

好吧,我不想使用辅助函数,在lambda中使用。使用lambdas的全部意义是“匿名”。所以是的,lambda是匿名的,并且是独立的。

1 个答案:

答案 0 :(得分:9)

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

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这一事实表明函数将被多次调用。