reduce() — функция из модуля functools, которая сворачивает итерируемый объект в одно значение: она берёт два первых элемента, применяет к ним вашу функцию, затем подставляет результат обратно и повторяет так до конца последовательности. В отличие от map() и filter(), она возвращает не список, а единственный итог.
from functools import reduce
numbers = [1, 2, 3, 4]
total = reduce(lambda x, y: x + y, numbers)
print(total) # 10
Что такое reduce() и зачем она нужна
Функция reduce() реализует классическую операцию свёртки (fold) из функционального программирования. Идея одна: пройти по коллекции и «накопить» результат в единственной переменной — сумму, произведение, максимум, объединённую строку или более сложную структуру. В Python 3 функция вынесена из встроенного пространства имён в модуль functools, поэтому её обязательно нужно импортировать. Это сигнал самого языка: reduce() — инструмент для конкретных задач, а не средство на каждый день.
Первый аргумент функции-обработчика — это накопленное значение (аккумулятор), второй — очередной элемент из последовательности. Результат каждого шага становится аккумулятором следующего. Именно поэтому передаваемая функция обязана принимать ровно два аргумента и возвращать одно значение.
Синтаксис и параметры
Сигнатура функции выглядит так:
functools.reduce(function, iterable[, initializer])
- function — функция двух аргументов
(accumulator, item), применяется к элементам кумулятивно, слева направо. - iterable — любой итерируемый объект: список, кортеж, множество, строка, генератор.
- initializer — необязательное начальное значение. Если указано, ставится перед первым элементом и служит результатом по умолчанию для пустой последовательности.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Как reduce() работает по шагам
![Свёртка списка [1, 2, 3, 4] в произведение: аккумулятор накапливает результат слева направо](https://ya.zerocoder.ru/wp-content/uploads/2026/07/scheme-16080-0.png)
Разберём вычисление произведения списка [1, 2, 3, 4]. Функция берёт первую пару, перемножает, подставляет результат обратно и идёт дальше, пока элементы не закончатся.
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 24
Цепочка вычислений эквивалентна выражению (((1 * 2) * 3) * 4). Ни один промежуточный список не создаётся — в памяти живёт только текущий аккумулятор, что делает свёртку экономной по памяти на длинных последовательностях.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Параметр initializer: зачем задавать начальное значение
Начальное значение решает две задачи: задаёт стартовую точку накопления и защищает код от исключения на пустой последовательности. Без initializer вызов reduce() на пустом итерируемом объекте выбрасывает TypeError.
from functools import reduce
numbers = [1, 2, 3, 4, 5]
total = reduce(lambda x, y: x + y, numbers, 10)
print(total) # 25 -> (((((10 + 1) + 2) + 3) + 4) + 5)
# Безопасно на пустом списке
print(reduce(lambda x, y: x + y, [], 0)) # 0
Практические примеры reduce()
Ниже — типовые задачи, которые решаются свёрткой в одну строку.
Максимальное значение
from functools import reduce
numbers = [4, 11, 7, 23, 9]
maximum = reduce(lambda x, y: x if x > y else y, numbers)
print(maximum) # 23
Сцепление строк
from functools import reduce
words = ["Python", "это", "просто"]
sentence = reduce(lambda a, b: a + " " + b, words)
print(sentence) # Python это просто
Именованная функция вместо lambda
Когда логика сложнее одного выражения, читаемость выше с обычной функцией и оператором operator:
from functools import reduce
from operator import mul
numbers = [1, 2, 3, 4]
print(reduce(mul, numbers)) # 24
reduce() против цикла и sum()
Свёртка редко бывает единственным решением. Для суммы почти всегда лучше встроенная sum() — она быстрее и читается мгновенно. Для произведения в современном Python есть math.prod(). Обычный цикл for выигрывает, когда шаг накопления содержит несколько действий или ветвлений. Сравните три способа одной суммы:
from functools import reduce
numbers = [1, 2, 3, 4]
# 1. reduce — универсально, но требует импорта и lambda
print(reduce(lambda x, y: x + y, numbers)) # 10
# 2. sum — идиоматично и быстрее для суммирования
print(sum(numbers)) # 10
# 3. Явный цикл — максимально прозрачно
total = 0
for n in numbers:
total += n
print(total) # 10
Практическое правило: если для вашей задачи существует встроенная функция (sum, max, min, any, all, math.prod, str.join), берите её. reduce() оправдана там, где стандартного инструмента нет, а логика накопления действительно нетривиальна.
Таблица: задача → reduce или альтернатива
| Задача | Рекомендуемый инструмент | Почему |
|---|---|---|
| Сумма чисел | sum(iterable) |
Быстрее и читается без импорта |
| Произведение чисел | math.prod(iterable) |
Встроено с Python 3.8, понятнее |
| Максимум / минимум | max() / min() |
Прямое назначение встроенных функций |
| Объединение строк | "".join(iterable) |
Не создаёт промежуточных строк |
| Проверка условия по всем | all() / any() |
Ленивы и короткозамкнуты |
| Нестандартная свёртка (композиция, сложный аккумулятор) | reduce() |
Готовой встроенной функции нет |
| Накопление с побочными эффектами или ветвлением | Цикл for |
Прозрачнее и легче отлаживать |
Когда reduce() лучше не использовать
Главный риск свёртки — потеря читаемости. Вложенная lambda внутри reduce() заставляет читателя мысленно раскручивать цепочку вычислений, тогда как эквивалентный sum() или цикл понятны сразу. Избегайте reduce(), если:
- для задачи есть встроенная функция или генераторное выражение;
- шаг накопления не помещается в одно короткое выражение;
- код читают начинающие, не знакомые с функциональным стилем.
Сам создатель Python Гвидо ван Россум предлагал перенести reduce() в functools именно из-за того, что явный цикл почти всегда понятнее. Это не запрет, а ориентир: применяйте свёртку осознанно.
Частые вопросы про reduce()
Нужно ли импортировать reduce в Python 3?
Да. В Python 3 функция доступна только через from functools import reduce. В Python 2 она была встроенной, но этот код давно неактуален.
Что вернёт reduce() на пустом списке?
Без initializer — выбросит TypeError. С указанным начальным значением вернёт этот initializer. Поэтому для потенциально пустых данных всегда задавайте третий аргумент.
reduce() или sum() — что быстрее?
Для суммирования sum() быстрее и читаемее: она реализована на C и не вызывает Python-функцию на каждом шаге. reduce() выигрывает только там, где готовой встроенной функции нет.
Можно ли передавать в reduce() функцию из модуля operator?
Да, и это часто предпочтительнее lambda. Например, reduce(operator.add, numbers) или reduce(operator.mul, numbers) читаются чище и работают чуть быстрее анонимной функции.
Заключение
Функция reduce() — компактный способ свернуть последовательность в одно значение, унаследованный Python из функционального программирования. Её сила в универсальности: тем же приёмом считают сумму, произведение, максимум, объединяют строки и собирают сложные структуры. Ключ к грамотному коду — понимать не только синтаксис, но и границы применимости: там, где есть sum(), max() или прозрачный цикл, они почти всегда лучше. Если вы разбираете комбинирование filter() и map(), добавьте к ним reduce() — вместе они составляют полный набор инструментов функционального стиля. Полное описание доступно в официальной документации Python и в русскоязычном справочнике functools. Проверить себя на подобных вопросах помогут частые вопросы на собеседовании Python-разработчика, а закрепить навык — небольшой проект вроде приложения для ведения бюджета.
- Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ