def a(p):
return p+1
def b(func, p):
return func(p)
b(a,10) # 11
在這裏,我不想要的結果「11」其實,我要的是帶參數的函數對象已被綁定,讓我們將其命名爲溫度。
當我使用c()
或類似的東西,它會給我結果11,可能嗎?
謝謝!
def a(p):
return p+1
def b(func, p):
return func(p)
b(a,10) # 11
在這裏,我不想要的結果「11」其實,我要的是帶參數的函數對象已被綁定,讓我們將其命名爲溫度。
當我使用c()
或類似的東西,它會給我結果11,可能嗎?
謝謝!
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
做到這一點的唯一方法,就是將其包裝在一個lambda:
c = lambda : b(a,10)
c() # 11
但如果你打算無論如何命名,並沒有真正買任何東西相比
def c():
b(a,10)
謝謝,實際上我會有一個b(a,x)的列表,我希望在列表中使用[x()for x)來獲得結果。 – user478514 2010-10-28 10:35:11
雖然我不知道使用的,使用的λ:
>>> 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
您可以創建調用另一個函數你想要的參數的函數。
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)
,你也可以使用functools模塊
import functools
def add(a,b):
return a+b
>> add(4,6)
10
>> plus7=functools.partial(add,7)
>>plus7(9)
16
兩個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
顯示它的速度更快,使並調用。 (雖然不是太多)
你能解釋爲什麼2和10可以分開嗎? – user478514 2010-10-28 13:16:50
functools.partial接受一個函數和一些參數,然後返回一個接受其餘參數的函數。 – 2010-10-28 14:05:05
部分不會返回一個函數,但會返回一個部分對象,所以如果您想用f來執行f(c),那麼將會失敗一個函數! – agemO 2016-12-20 10:23:30