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:]
, что показывает, что это может быть выражено как ваниль 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 ]