Содержание
  1. Что такое reduce() и зачем она нужна
  2. Как reduce() работает по шагам
  3. Практические примеры reduce()
  4. reduce() против цикла и sum()
  5. Когда reduce() лучше не использовать
  6. Частые вопросы про reduce()
  7. Заключение
СправочникОбновлено · 07.2026

Понимание функции reduce() в Python

26 февраля 2024 · 6 минут чтения

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 — необязательное начальное значение. Если указано, ставится перед первым элементом и служит результатом по умолчанию для пустой последовательности.

Как 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" двойной блок курсов не обнаружен

Читайте также

3 материала