[英]How to consume/chain functions “Pythonically”?
我有一组函数f(x), g(x), s(x), t(x)
。
它们被设计成像这样链接在一起: f(g(s(t(x))))
这些功能的设计使它们可以按任何顺序链接。 我的代码的另一部分在列表中构建序列: [f, g, s, t]
是否有一种优雅的方式来获取列表并链接函数调用,获取最后结果的输出?
现在很明显我可以使用一个跟踪输出的外部计数器变量和一个简单的for
循环增量索引,但我想知道是否有更多的Pythonic方法来做到这一点?
减少是完美的答案(尽管我们需要从最内层的功能开始,因此reversed
):
import functools
functions = [f, g, s, t]
y = functools.reduce(lambda a, f: f(a), reversed(functions), x)
编辑:使用常量参数,就像这样简单:
p1, p2 = 5, 42
y = functools.reduce(lambda a, f: f(a, p1, p2), reversed(functions), x)
Martineau和Amadan已经发布了“优雅”的解决方案。 现在,真正的pythonic解决方案就像它可以得到的那样简单,简单,简单无聊:
def chain(arg, *funcs):
# chain(42, f, g, s) => f(g(s(42)))
result = arg
for func in reversed(funcs):
result = func(result)
return result
显然不是大多数人会认为“优雅”的东西,但它非常明显,可读,并且很容易跟踪和调试 - 这就是wrt / python最重要的理念。
在函数式编程中,此操作称为函数组合。 Python在标准库中没有compose函数,但是自己编写起来相当容易:
from functools import partial
# additional import for python 3: from itertools import reduce
def compose(*args):
return partial(reduce, lambda x, y: y(x), reversed(args))
然后你可以编写这样的函数
fgst_x = compose(f, g, s, t)(x)
要么
funcs = [f, g, s, t]
fgst = compose(*funcs)
fgst_x = fgst(x)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.