2013-10-23 34 views
2

同樣來自同一本書例如:Python deep nesting factory functionsPython的工廠函數

def maker(N): 
    def action(X): 
     return X ** N 
    return action 

我明白它背後的概念,我認爲這是很整潔,但我似乎無法想象的時候,我可以用這個方法。

我可以很容易地實現上述,讓maker()代替N和X作爲參數。

有沒有人使用這種類型的工廠函數,並向我解釋爲什麼你採取這種方法,而不是僅僅採取多個參數?

它只是用戶偏好?

+1

「相同」相比什麼? – glglgl

回答

3
squarer = maker(2) 

print(squarer(2)) # outputs 4 
print(squarer(4)) # outputs 16 
print(squarer(8)) # outputs 64 

從本質上講,這意味着你只需要在N值一旦進入,然後你以後不能再更改。

我認爲這主要是編程風格,因爲有多種方式來做同樣的事情。但是,通過這種方式,您只能輸入一次N的值,因此您可以添加代碼來測試它是否爲有效值,而不是在每次調用函數時都檢查。

編輯 只是想到了一個可能的例子(儘管它通常使用類處理):

writer = connectmaker("127.0.0.1") 
writer("send this text") 
writer("send this other text") 

的「製造商」的方法將然後連接到地址一次,然後維持該值每次致電writer()。但正如我所說,像這樣的東西通常是一個類,其中__init__將存儲的值。

+1

'**'不是乘法,所以'doubler'這個名稱是錯誤的,給定的結果也是如此。儘管如此,+1意味着正確的事情。 – glglgl

+1

doh!改變它''squarer' –

+0

是的,我現在看到它與connectmaker示例更好。 – ealeon

1

以某種方式,您也可以看到一些operator函數。

例如,operator.itemgetter()以這種方式工作:

import operator 
get1 = operator.itemgetter(1) # creates a function which gets the item #1 of the given object 
get1([5,4,3,2,1]) # gives 4 

這通常被用來即G。作爲排序函數等的函數。

如果您有一個具體的問題可以解決,那麼您可以輕鬆地想到類似的,更具體的用例。

在同一聯賽你有這些「裝飾創造者」:

def indirect_deco(outer_param): 
    def real_deco(func): 
     def wrapper(*a, **k): 
      return func(outer_param, *a, **k) 
     return wrapper 
    return real_deco 

@indirect_deco(1) 
def function(a, b, c): 
    print (((a, b, c)) 

function(234, 432) 

同樣在這裏,外部函數是一個工廠函數創建了「真正的裝飾」功能。反過來,這甚至會創建另一個代替最初給定的代理。

+0

是的,我明白,但爲什麼比只獲得(1,[5,4,3,2,1])更好?只是爲了讓我不必一直通過1? – ealeon

+1

@ealeon完全取決於用例是否需要它。也許它僅僅是一種簡化;也許這是絕對需要的,因爲你必須調整接口。 – glglgl

+0

啊有意思。 – ealeon