是否可以创建一个将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函数。
假设我尝试做的事情是可能的,我该如何传达正确的语法呢?
此外,是否有这种事物的特定名称,而不是"返回功能的功能"?它在技术上不是嵌套功能,对吧?
答案 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.