一个返回函数的函数(在python中)

时间:2015-10-29 05:04:24

标签: python python-3.x

是否可以创建一个将lambda函数作为参数的函数(每个lambda函数使用参数x),然后返回一个具有单个参数x的新函数,并返回所有lambda函数?

这是我的非工作示例:

def func_you( lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4):
    return def func_you_2(x):
        return lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x)

基本上发生的事情是你有一个函数func_you,它使用参数x获取4个lambda函数。例如,lambdafunc1的参数可能类似于lambda x: x + 10

func_you然后返回一个名为func_you_2的新函数,其输出是所有这些lambda函数的乘积,并且有一个参数x,它被传递给x参数每个func_you的lambda函数。

假设我尝试做的事情是可能的,我该如何传达正确的语法呢?

此外,是否有这种事物的特定名称,而不是"返回功能的功能"?它在技术上不是嵌套功能,对吧?

4 个答案:

答案 0 :(得分:3)

到目前为止,我的答案并不比任何其他答案好,但是我想稍微调整一下,以便在问题上挤出更多功能性编程 - 只是为了好玩。

from functools import reduce
from operator import mul

def functioners(*funcs):
    def inner(x):
        return reduce(mul, [f(x) for f in funcs], 1)
    return inner

In [2]: res = functioners(lambda x: x+1, lambda x: x *2, lambda x: x+3)

In [3]: res(5)
Out[3]: 480

In [4]: res = functioners(lambda x: x+1, lambda x: x +1, lambda x: x+1)

In [5]: res(1)
Out[5]: 8

修改

为了实现一种10分钟的蜷缩尝试,我甚至对它有点疯狂。这不是我要对待我的同事的事情,但现在已经很晚了,所以也许只是为了好玩......

应该可以定义一个可以继续返回部分应用版本的函数,但我猜你需要某种方法来告诉它停止吗?

这是我的尝试:

from functools import partial, reduce
from operator import mul

def functionals(*funcs, finished=None):
    def inner(x):
        return reduce(mul, [f(x) for f in funcs], 1)

    if finished is not None:
        # stop condition
        return inner
    else:
        return partial(functionals, *funcs)

你可以像这样使用它(如果你这么倾向......)

In [37]: f1 = functionals(lambda x: x+1)

In [38]: f2 = f1(lambda x: x + 1)

In [39]: f3 = f2(lambda x: x + 1, lambda x: x + 1, lambda x: x + 1)

In [40]: f3(finished="definitely!")(1)
Out[40]: 32

(我现在会戴上帽子和外套......)

答案 1 :(得分:2)

您可以返回执行所需操作的lambda函数。示例 -

def func_you( lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4):
    return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x)

演示 -

>>> def func_you( lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4):
...     return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x)
...
>>> f = func_you(sum,min,max,sum)
>>> f([1,2])
18

答案 2 :(得分:1)

这在技术上绝对是一个嵌套函数:

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4):
    def func_you_2(x):
        return lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x)

    return func_you_2

但你也可以使用lambda

def func_you(lambdafunc1, lambdafunc2, lambdafunc3, lambdafunc4):
    return lambda x: lambdafunc1(x) * lambdafunc2(x) * lambdafunc3(x) * lambdafunc4(x)

答案 3 :(得分:0)

def - 内 - def结构实际上很常见。它用于实现decorator functions,它将函数作为输入,以某种方式修改它,并返回修改后的函数。基本上,这个结构:

@decorator
def func(param):
    # stuff

与:

相同
def func(param):
    # stuff

func = decorator(func)

例如,假设您有几个要修改的函数,以便它们在进入和退出时打印消息。你写了一个装饰函数:

def mark_entry_and_exit(func):
    def inner(*args, **kwargs):
        print "Entering function."
        try:
            result = func(*args, **kwargs)
        except:
            print "Exiting with exception."
            raise
        print "Exiting function."
        return result
    return inner

然后使用它,您只需使用上面的@表示法:

@mark_entry_and_exit
def my_function(a, b):
    print "Running with", a, b

my_function(1, b=2)

打印:

Entering function.
Running with 1 2
Exiting function.