当我开始编写这个问题时,我没有想到嵌套列表的简单解决方案,但现在无论如何都希望找到一个。
这是一个丑陋的代码:
fun0(
fun1(fun2(fun3(arg1))),
fun1(fun2(fun3(arg4))),
fun1(fun2(fun3(arg4))),
fun1(fun2(fun3(arg4))))
哎哟!给出了名称以供示例。在实际应用中,他们的名字没有这样的模式。
我在map(map ...)
和reduce(map ...)
得到错误的结果或TypeError
之前玩了一下,然后再去写这篇文章。当然,简单的解决方案是在编写问题时使用:使用列表推导。像这样的东西(尚未测试):
fun0([i(j) for i in (fun1, fun2, fun3) for j in (arg1, arg2, arg3, arg4)])
不过,我想知道如何才能通过功能编程工具实现相同的目标?
fun0(map(fun1, map(fun2, map(fun3,
(arg1, arg2, arg3, arg4)))))
我认为还有一种模式可以删除。我试过map(map, (fun1, ...), (arg1, ...))
,但这样Python试图迭代每个参数并引发错误。
答案 0 :(得分:2)
你的3个例子做了3件不同的事。
您的原件与
相同fun0(map(lambda x:fun1(fun2(fun3(x))), [arg1,arg2,arg3,arg4])
你的第二个例子,如果你绝对想要一个功能形式,可能就像
fun0(map(apply, itertools.product([fun1,fun2,fun3],[arg1,arg2,arg3,arg4])))
答案 1 :(得分:1)
def composed(x): return fun1(fun2(fun3(x)))
fun0(*map(composed, (arg1, arg2, arg3, arg4)))
当然,您可以使用lambda
,而不是命名中间函数composed
,但我发现这种方式更具可读性。
请注意*
是至关重要的,否则你用一个参数,一个列表调用fun0
,而不是用四个参数调用它! - )
答案 2 :(得分:-1)
重写第一个代码块的最有效方法是组合三个函数,将组合函数映射到参数列表,然后将fun0应用于列表。 Python实际上没有一种自然的方式来进行函数组合,所以像Jimmy的解决方案就是你最终会遇到的。
但是,Python风格倾向于阻止lambdas,所以我可能会把它写成列表理解而不是地图:fun0(*[fun1(fun2(fun3(x))) for x in [arg1, arg2, arg3, arg4]])
编辑:错过了fun0需要单独的参数,而不是列表;根据Alex Martelli的帖子添加*
。