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 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

Как reduce() работает по шагам

Свёртка списка [1, 2, 3, 4] в произведение: аккумулятор накапливает результат слева направо
Свёртка списка [1, 2, 3, 4] в произведение: аккумулятор накапливает результат слева направо

Разберём вычисление произведения списка [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 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети 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-разработчика, а закрепить навык — небольшой проект вроде приложения для ведения бюджета.

для id="пайтон2" двойной блок курсов не обнаружен
Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно