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

Mar*_*eck 3 python lambda

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

例如

lambda x: re.compile(r'foobar').match(x)
Run Code Online (Sandbox Code Playgroud)

是不是很好,因为它可能会在每次调用时重新编译(如果re用完了缓存 - 感谢响应者指出缓存机制).

我可以这样做而无需重新编译:

def f(line):
    try:
        f.c
    except:
        f.c = re.compile(r'foobar')
    return f.c.match(line)
Run Code Online (Sandbox Code Playgroud)

怎么用lambda做,不重新编译?

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

che*_*ner 9

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

lambda x, regexobject=re.compile(r'foobar'): regexobject.match(x)
Run Code Online (Sandbox Code Playgroud)

lambda定义时会计算默认值,而不是每次调用默认值.


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

regex1 = re.compile(r'foobar')
regex2 = re.compile(r'bazquux')
# etc
Run Code Online (Sandbox Code Playgroud)

然后在需要的地方传递绑定方法.也就是说,而不是

somefunction(lambda x, regexobject=re.compile(r'foobar'): regexobject.match(x))
Run Code Online (Sandbox Code Playgroud)

使用

somefunction(regex1.match)
Run Code Online (Sandbox Code Playgroud)

匿名函数的用例是只调用一次的用例,因此将名称绑定到它是没有意义的.您担心re.compile被多次调用这一事实表明这些函数将被多次调用.