Skip to content

Функция reduce()

Функция reduce() – позволяющий применять функцию к последовательности элементов, накапливая результат. Она сводит (или "редуцирует") последовательность к одному значению.

reduce() позволяет выполнять свертки и агрегации данных в функциональном стиле.
Начиная с Python 3, reduce() перемещен в модуль functools, поэтому его нужно импортировать.

python
reduce(function, iterable[, initial]) -> value
  • function: функция, принимающая два аргумента и возвращающая одно значение.
  • iterable: итерируемый объект.
  • initializer (опционально): начальное значение аккумулятора.
Из официальной документации functools:

Английский:

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value.

For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable.

If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty.

If initializer is not given and the iterable contains only one item, the first item is returned.


Русский:

Применяет функцию двух аргументов кумулятивно к элементам итерируемого объекта слева направо, чтобы свести его к одному значению.

Например, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) вычисляет ((((1+2)+3)+4)+5). Левый аргумент, x, — это накопленное значение, а правый аргумент, y, — это обновляемое значение из итерируемого объекта.

Если указан необязательный инициализатор initializer, он помещается перед элементами итерируемого объекта в вычислении и служит значением по умолчанию, когда итерируемый объект пуст.

Если инициализатор не задан, а итерируемый объект содержит только один элемент, возвращается первый элемент.

Сравнение задач без reduce() и с reduce():

Пример: Сумма всех элементов списка.

python
# without reduce()
numbers = [1, 2, 3, 4, 5]
sum_value = 0
for number in numbers:
    sum_value += number
print(sum_value)  # Output: 15


# with reduce
from functools import reduce

numbers = [1, 2, 3, 4, 5]
sum_value = reduce(lambda x, y: x + y, numbers)
print(sum_value)  # Output: 15

reduce() делает код более компактным и выразительным, особенно для задач, связанных с накоплением значений.

Использование встроенных функций с reduce():

python
from functools import reduce
import operator

numbers = [1, 2, 3, 4, 5]
product = reduce(operator.mul, numbers)  # Вычисление произведения
print(product)  # Output: 120

Использование обычной функции с reduce():

python
from functools import reduce

def my_add(x, y):
    return x + y

numbers = [1, 2, 3, 4, 5]
sum_value = reduce(my_add, numbers)
print(sum_value)  # Output: 15

Использование лямбда-функции с reduce():

python
from functools import reduce

numbers = [1, 2, 3, 4, 5]
sum_value = reduce(lambda x, y: x + y, numbers)
print(sum_value)  # Output: 15

Использование reduce() со всеми параметрами:

python
from functools import reduce

numbers = [1, 2, 3, 4, 5]
initial_value = 10
sum_value = reduce(lambda x, y: x + y, numbers, initial_value)
print(sum_value)  # Output: 25

Здесь initial_value используется как начальное значение аккумулятора. Если numbers был бы пустым списком, reduce() вернул бы initial_value.

Упражнения:

  1. Произведение чисел: Напишите программу, которая вычисляет произведение всех чисел в списке, используя reduce().
  2. Конкатенация строк: Используйте reduce() для объединения всех строк в списке в одну строку.
  3. Нахождение наибольшего элемента: Напишите программу, которая находит наибольший элемент в списке с помощью reduce().
  4. Нахождение наименьшего элемента: Аналогично предыдущему, найдите наименьший элемент.
  5. Найдите наибольший общий делитель (НОД) всех чисел в списке.
  6. Объединить строки из списка в одну строку.
  7. Сложение элементов словаря: Дан словарь, значения которого являются числами. Используйте reduce() для вычисления суммы всех значений.
  8. Чётные и нечётные: Дан список чисел. Используйте reduce() для создания нового списка, содержащего только четные числа из исходного списка (подсказка: используйте filter() внутри лямбда-функции, переданной в reduce()). Создайте другую программу, которая делает то же самое для нечетных чисел.

Contacts: teffal@mail.ru