2010-10-28 85 views
4

所有,返回一個帶參數綁定的函數對象?

def a(p): 
    return p+1 

def b(func, p): 
    return func(p) 

b(a,10) # 11 

在這裏,我不想要的結果「11」其實,我要的是帶參數的函數對象已被綁定,讓我們將其命名爲溫度。

當我使用c()或類似的東西,它會給我結果11,可能嗎?

謝謝!

回答

5

functools模塊提供了partial功能,可以給你更多的功能:

import functools 

def a(p): 
    return p+1 

def b(func, p): 
    return functools.partial(func, p) 

c = b(a,10) 
print c() # >> 11 

它可用於某些參數適用於功能,剩下的要提供:

def add(a,b): 
    return a+b 

add2 = functools.partial(add, 2) 
print add2(10) # >> 12 
+0

你能解釋爲什麼2和10可以分開嗎? – user478514 2010-10-28 13:16:50

+0

functools.partial接受一個函數和一些參數,然後返回一個接受其餘參數的函數。 – 2010-10-28 14:05:05

+0

部分不會返回一個函數,但會返回一個部分對象,所以如果您想用f來執行f(c),那麼將會失敗一個函數! – agemO 2016-12-20 10:23:30

5

做到這一點的唯一方法,就是將其包裝在一個lambda:

c = lambda : b(a,10) 
c() # 11 

但如果你打算無論如何命名,並沒有真正買任何東西相比

def c(): 
    b(a,10) 
+0

謝謝,實際上我會有一個b(a,x)的列表,我希望在列表中使用[x()for x)來獲得結果。 – user478514 2010-10-28 10:35:11

1

雖然我不知道使用的,使用的λ:

>>> def a(p): return p+1 
... 
>>> def b(func, p): 
...  g = lambda p: func(p) 
...  return g 
... 
>>> 
>>> b(a, 4) 
<function <lambda> at 0x100430488> 
>>> k = b(a, 4) 
>>> k(5) 
6 
0

您可以創建調用另一個函數你想要的參數的函數。

def old_function(x,y): 
    return x+y 

def bound_parameter_function(x): 
    return old_function(x,10) 

當然,如果你需要即時創建這樣的功能,你可以寫其他的功能,沒有工作適合你:

def parameter_bound(f, parm_to_bind): 
    def ret(y): 
     return f(parm_to_bind,y) 
    return ret 

new_func=parameter_bound(old_function,10) 
new_func(1) 
7

,你也可以使用functools模塊

 

import functools 

def add(a,b): 
    return a+b 

>> add(4,6) 

10 
>> plus7=functools.partial(add,7) 
>>plus7(9) 
16 

 
0

兩個functool並返回一個函數對象的工作。我跑過的一個小測試表明,返回一個函數對象方法稍微快一點。

import time 
import functools 

##################################### 
## Returning function object method 
##################################### 

def make_partial(n): 
    def inc(x): 
     return x+n 
    return inc 

start = time.clock() 
for i in range(10000): 
    g = make_partial(i) 
print("time taken to create 10000: {}".format(time.clock() - start)) 

b = 0 

start = time.clock() 
for i in range(10000): 
    b += g(i) 
print("time taken to use it 10000 times: {}".format(time.clock() - start)) 


##################################### 
## Using functools method 
##################################### 

def make_partial2(x,n): 
    return x + n 

start = time.clock() 
for i in range(10000): 
    g = functools.partial(make_partial2,i) 
print("time taken to create 10000: {}".format(time.clock() - start)) 

b = 0 

start = time.clock() 
for i in range(10000): 
    b += g(i) 
print("time taken to use it 10000 times: {}".format(time.clock() - start)) 

這就造成:

time taken to create 10000: 0.0038569999999999993 
time taken to use it 10000 times: 0.0030769999999999964 
time taken to create 10000: 0.004314000000000151 
time taken to use it 10000 times: 0.00390299999999999 

顯示它的速度更快,使並調用。 (雖然不是太多)