在Python 3中,这是我想要修改的一线函数:
def compose(*fncs):
return functools.reduce(lambda f,g: lambda x: f(g(x)), fncs, lambda x: x)
当我使用c = compose(h, g, f)
编写函数时,调用c(x)
等同于调用h(g(f(x))
通过尽可能少地更改现有的单线,我想创建一个compose_intermed(*fncs)
函数,该函数返回一种稍有不同的组合函数。调用此函数时,它不返回组成函数的最终值,而是返回第一个元素为最终值的列表,然后是应用组成函数的每一步的所有中间值。
当我使用ci = compose_intermed(h, g, f)
编写函数时,调用ci(x)
将返回列表[h(g(f(x))), g(f(x)), f(x)]
。
我想尽可能少地修改组合函数 ,继续使用reduce
或列表理解,而不是循环。我知道可能会有更简单的方法,但是我试图以此作为练习,以提高我对函数式编程和Python 3联系的一般理解。
奖励问题:此函数在函数式编程世界中是否还有另一个更标准化的名称?我已经搜索了几个库,但尚未找到要执行的库功能。
答案 0 :(得分:1)
Ry的评论是一个很好的起点。在这篇文章中,我将尝试证明他/她在说什么-
from functools import reduce
def identity(x):
return x
def pipeline(f = identity, *fs):
return reduce(lambda r,f: lambda x: f(r(x)), fs, f)
进行两个简单的功能测试。注意pipeline
如何以从左到右的顺序应用功能-
def add1(x):
return x + 1
def mult2(x):
return x * 2
f = pipeline(mult2, add1, add1, add1)
print(f(10))
# 23
接下来,实现pipeline_intermediate
。就像Ry注释一样,最后使用[::-1]
-
def pipeline_intermediate(f = identity, *fs):
return lambda x: reduce(lambda r,f: [f(r[0])]+r, fs, [f(x)]) [::-1]
g = pipeline_intermediate(mult2, add1, add1, add1)
print(g(10))
# [20, 21, 22, 23]
现在您可以看到如何实现从右到左的compose_intermediate
吗?您知道为什么更具挑战性吗?