#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
с параметрами
- как
function
: применить текущую функцию к предыдущему результату - как
sequence
: список функций - в качестве
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