применить список функций к итерации один за другим в python

#python #python-3.x #lambda #functional-programming #reduce

#python #python-3.x #лямбда #функциональное программирование #уменьшить

Вопрос:

У меня есть функция process , которая принимает список функций и итерацию. Я хочу применить каждую функцию в этом списке к итерации одну за другой. Я написал это, которое работает нормально, но…

 def process(list_of_funcs, string):
  for func in list_of_funcs:
    string = ''.join(list(map(func, string)))
  return string

ans = process([lambda c: c.upper(), lambda c: c   '0'], "abcd")
print(ans) # A0B0C0D0
  

Я хочу пропустить цикл for (и сделать это способом функционального программирования). Есть ли способ для этого в python?

Комментарии:

1. Если бы первая функция была lambda c: c.upper() * 2 , вы бы хотели получить "AA0BB0CC0DD0" или "A0A0B0B0C0C0D0D0" ?

2. Последний — A0A0B0B0C0C0D0D0 .

Ответ №1:

Вы можете использовать functools.reduce с параметрами

  1. как function : применить текущую функцию к предыдущему результату
  2. как sequence : список функций
  3. в качестве initial значения: начальная строка
 def process(list_of_funcs, string):
    return reduce(lambda res, f: ''.join(map(f, res)), list_of_funcs, string)
  

Примечание: нет необходимости в промежуточном list , join принимает iterator


Вот пример с 3 функциями, и он дает тот же результат, что и ваше первоначальное решение for-loop

 fcts = [lambda c: c.upper(), lambda c: c   '0', lambda c: c * 2]
ans = process(fcts, "abcd")
print(ans)  # AA00BB00CC00DD00