返回带参数binded的函数对象?

时间:2010-10-28 10:28:21

标签: python function object return

所有

def a(p):
    return p+1

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

b(a,10)   # 11

这里我实际上不希望结果为“11”,我想要的是一个带参数的函数对象已被绑定,让我们将其命名为c。

当我使用c()或类似的东西时,它会给我结果11,可能吗?

谢谢!

6 个答案:

答案 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

显示制作和通话速度更快。 (虽然不是很多)