修改函数python compose()以返回所有中间值的列表

时间:2019-06-22 02:42:21

标签: python python-3.x functional-programming

在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联系的一般理解。

奖励问题:此函数在函数式编程世界中是否还有另一个更标准化的名称?我已经搜索了几个库,但尚未找到要执行的库功能。

1 个答案:

答案 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吗?您知道为什么更具挑战性吗?