如何使用map和reduce在Python中按步骤组合函数列表

如何使用map和reduce在Python中按步骤组合函数列表,python,dictionary,functional-programming,reduce,Python,Dictionary,Functional Programming,Reduce,给定一组函数(函数)和一个整数n,我试图找出一种逐步组合它们的方法,并返回每个逐步结果的列表,如下所示: compose_step([lambda x: x+3, lambda x: x+5, lambda x: x+1], 8) --> [8, 11, 16, 17] def compose(functions, n): def compose2(f,g): return lambda x: f(g(x)) composedFunction = func

给定一组函数(函数)和一个整数n,我试图找出一种逐步组合它们的方法,并返回每个逐步结果的列表,如下所示:

compose_step([lambda x: x+3, lambda x: x+5, lambda x: x+1], 8) --> [8, 11, 16, 17]
def compose(functions, n):
    def compose2(f,g):
        return lambda x: f(g(x))
    composedFunction = functools.reduce(compose2, functions, lambda x: x)
    return composedFunction(n)
因此,到目前为止,我已经了解了如何组合函数列表并返回结果,如下所示:

compose_step([lambda x: x+3, lambda x: x+5, lambda x: x+1], 8) --> [8, 11, 16, 17]
def compose(functions, n):
    def compose2(f,g):
        return lambda x: f(g(x))
    composedFunction = functools.reduce(compose2, functions, lambda x: x)
    return composedFunction(n)
然而,我非常困惑如何跟踪每个步骤并将其作为列表返回。我假设我需要以某种方式使用map,以便将每一步映射到列表中。我还提出了一种将列表中的所有函数应用于n的方法,如下所示:

def apply_all_functions(functions, n):
    answerList = list(map(methodcaller('__call__', n), functions)))
    return answerList
我想用composeFunction函数组成一个新的逐步函数列表,一直到完全合成的函数,然后用它作为apply_all_函数的新列表,以达到预期的结果。但是现在,我很困惑

您可以与合成函数一起使用

from itertools import accumulate

def compose(f, g):
    return lambda x: f(g(x))

funcs = [lambda x: x, lambda x: x+3, lambda x: x+5, lambda x: x+1]

print([f(8) for f in accumulate(funcs, compose)])
# [8, 11, 16, 17]

itertools.accumulate
是一种方法,但是如果你想知道如何自己做到这一点,这里有一种方法

def apply_all (x, f = None, *fs):
  if f is None:
    return []
  else:
    next = f (x)
    return [ next ] + apply_all(next, *fs)

funcs = \
  [ lambda x: x
  , lambda x: x+3
  , lambda x: x+5
  , lambda x: x+1
  ]

print(apply_all(8, *funcs))
# [ 8, 11, 16, 17 ]
如果您需要原始问题中的表格

def apply_all (fs, x):
  if not fs:
    return []
  else:
    next = fs[0](x)
    return [ next ] + apply_all(fs[1:], next)

funcs = \
  [ lambda x: x
  , lambda x: x+3
  , lambda x: x+5
  , lambda x: x+1
  ]

print(apply_all(funcs, 8))
# [ 8, 11, 16, 17 ]
上面的表单在
fs[0]
fs[1:][/code>上运行,这表明这可以表示为一个普通的
reduce

from functools import reduce

def apply_all (fs, x):
  def reducer (acc, f):
    (seq, x) = acc
    next = f (x)
    return (seq + [next], next)
  return reduce(reducer, fs, ([], x)) [0]

funcs = \
  [ lambda x: x
  , lambda x: x+3
  , lambda x: x+5
  , lambda x: x+1
  ]

print(apply_all(funcs, 8))
# [ 8, 11, 16, 17 ]

你能再解释一下你的目标是什么吗?我不明白你的投入和预期产出是什么。