Appearance
Функция 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
.
Упражнения:
- Произведение чисел: Напишите программу, которая вычисляет произведение всех чисел в списке, используя
reduce()
. - Конкатенация строк: Используйте
reduce()
для объединения всех строк в списке в одну строку. - Нахождение наибольшего элемента: Напишите программу, которая находит наибольший элемент в списке с помощью
reduce()
. - Нахождение наименьшего элемента: Аналогично предыдущему, найдите наименьший элемент.
- Найдите наибольший общий делитель (НОД) всех чисел в списке.
- Объединить строки из списка в одну строку.
- Сложение элементов словаря: Дан словарь, значения которого являются числами. Используйте
reduce()
для вычисления суммы всех значений. - Чётные и нечётные: Дан список чисел. Используйте
reduce()
для создания нового списка, содержащего только четные числа из исходного списка (подсказка: используйтеfilter()
внутри лямбда-функции, переданной вreduce()
). Создайте другую программу, которая делает то же самое для нечетных чисел.