В 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.
Дополнительный вопрос: Есть ли у этой функции еще одно более стандартизированное имя в мире функционального программирования? Я искал несколько библиотек и еще не нашел библиотечной функции для того, что я пытаюсь сделать.