所有
def a(p):
return p+1
def b(func, p):
return func(p)
b(a,10) # 11
这里我实际上不希望结果为“11”,我想要的是一个带参数的函数对象已被绑定,让我们将其命名为c。
当我使用c()
或类似的东西时,它会给我结果11,可能吗?
谢谢!
答案 0 :(得分:8)
您也可以使用functools模块
import functools
def add(a,b):
return a+b
>> add(4,6)
10
>> plus7=functools.partial(add,7)
>>plus7(9)
16
答案 1 :(得分:8)
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
答案 2 :(得分:6)
唯一的方法是将它包装在lambda中:
c = lambda : b(a,10)
c() # 11
虽然如果你打算给它命名,但与
相比,这并没有给你带来任何好处def c():
b(a,10)
答案 3 :(得分:2)
虽然我不确定使用,但请使用lambda:
>>> 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
答案 4 :(得分: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)
答案 5 :(得分: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
显示制作和通话速度更快。 (虽然不是很多)