我可以在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是匿名的,并且是独立的。
答案 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
这一事实表明函数将被多次调用。