Опубликован: 01.12.2023 78
В Python есть простая, но одновременно мощная функция reduce()
из модуля functools
, позволяющая "сворачивать" итерируемую последовательность, сводя ее к единственному значению.
Функция reduce()
принимает функцию и итерируемый объект в качестве параметров и применяет полученную функцию к парам значений из итерируемого объекта, пока не останется только одно значение.
Синтаксис: reduce( function, iterable [, initializer] )
function
- функция, которая кумулятивно применяется к парам элементов итерируемой последовательности, сводя ее к единственному значению;iterable
- итерируемая последовательность;initializer
- базовое значение, с которого требуется начать отсчет (необязательный аргумент).from functools import reduce
# сворачивание списка с помощью вычисления факториала
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, numbers, 1)
print(result)
120
# сворачивание списка суммированием (нарастающим итогом)
numbers = [1, 2, 3, 4, 5]
total = reduce(lambda x, y: x + y, numbers)
print(total)
15
Функцию reduce()
можно эффективно использовать не только для сворачивания списков, но и для обработки других итерируемых последовательностей.
Например, если у вас есть словарь с числовыми значениями и необходимо получить их сумму, то вместо использования цикла for
для перебора всех элементов словаря, можно применить более короткое и эффективное решение с функцией reduce()
:
dict_data = {"Петров": 4, "Иванов": 5, "Сидоров": 3, "Cмирнов": 7}
print(reduce(lambda x, key: x + dict_data[key], dict_data, 0))
19
reduce()
.Числа Фибоначчи - числовая последовательность, в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих.
Для вычисления элементов последовательности Фибоначчи можно использовать функцию reduce()
:
# вычисление последовательности Фибоначчи
fib = lambda n: reduce(lambda x, _: x+[x[-1]+x[-2]], range(n-2), [0, 1])
fib(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
reduce()
от аналогичной функции accumulate()
.Основное отличие между функциями functools.reduce()
и itertools.accumulate()
заключается в том, что:
reduce()
сохраняет промежуточный результат и возвращает только итоговое значение суммирования;accumulate()
возвращает итератор, содержащий промежуточные результаты вычислений и итоговое значение.from functools import reduce
from itertools import accumulate
list_a = [15, 30, 20, 10, 25]
print(f"Сумма списка с помощью accumulate() : {list(accumulate(list_a, lambda x, y: x+y))}")
Сумма списка с помощью accumulate() : [15, 45, 65, 75, 100]
print(f"Сумма списка с помощью reduce() : {reduce(lambda x, y: x+y, list_a)}")
Сумма списка с помощью reduce() : 100
Методы преобразования списка в строку и обратно
Подсчет количества вложенных списков в списке
Поэлементное суммирование списков (кортежей)
Комментариев нет.