2012-10-18 59 views
0

在Python中,一個簡單的功能foo(x, y)至少有3種方式,我知道的說法y綁定到某一值時蟒蛇3.X:綁定參數給定的值

# defining a nested function: 
def foobar(x): 
    return foo(x, y=yval) 

# using lambda 
foobar = lambda x: foo(x, y=yval) 

# using functools 
from functools import partial 
foobar = partial(foo, y=yval) 

雖然我懷疑上面的列表是詳盡的,我也想知道我應該去哪一個?在性能,安全性和命名空間處理方面它們都是否相同?或者每種方法是否存在額外的開銷和警告?當其他方法已經存在時,爲什麼functools定義爲partial

+0

'partial'並沒有真正的「綁定」參數值。它定義了一個包裝舊函數的新函數,並在調用舊函數時「填充」參數值。 –

+1

@JoelCornett對於所有其他選項也是如此。它幾乎是唯一的方法來做到這一點,而不會將其放入代表函數的內置函數中。 – delnan

+0

@delnan:是的。你是絕對正確的。 –

回答

4

不,它們並不完全相同 - 尤其是,lambda不能被醃漬,functools.partial只能在最近的Python版本中被醃製(我無法在文檔中找到確切的版本;它在2.6中不起作用,但在3.1中起作用)。在其他函數內部都不能定義函數(在2.6和3.1中都沒有)。

原因partial的外觀在庫是它給你一個明確的成語部分應用功能的內聯。定義(def)不能在這樣的表達式中出現

map(partial(foo, y=yval), xs) 

此外,從定義或lambda,它不是立即清楚,部分應用程序是怎麼回事,因爲你可以把任意表達式一個lambda和定義中的任意語句。

我建議你去partial除非你有充分的理由不使用它。

[事實上,這份清單並非詳盡無遺。浮現在腦海的第一個選擇是一個可調用對象:

class foobar: 
    def __init__(self, yval): 
     self.__yval = yval 
    def __call__(self, x): 
     return foo(x, self.__yval) 

,但這些都是沉重的權重對於這樣一個簡單的問題]

+0

它只是'partial',或者任何在以前的版本中不能被醃漬的包裝函數? –

+1

@JoelCornett:'lambda'不能在任何版本中被醃漬,我相信也不能嵌套函數。 –