2015-04-23 44 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

相關問題