📝 Python

reduce() — Сверни всё в одно!

P
Автор
PyLand Team
📅
Опубликовано
03.04.2026
⏱️
Время чтения
3 мин
👁️
Просмотров
438
🌿
Уровень
Средний

Охватываемые темы: Что такое reduce()?, Как работает reduce()?, Базовые примеры, Практические примеры.

Что такое reduce()?

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

from functools import reduce

numbers = [1, 2, 3, 4, 5]

# Старый способ
total = 0
for num in numbers:
    total = total + num

# С reduce()
total = reduce(lambda acc, x: acc + x, numbers)
print(total)  # 15

Синтаксис

from functools import reduce

reduce(функция, итерируемый_объект, начальное_значение)
  • функция — принимает 2 аргумента: аккумулятор и текущий элемент
  • итерируемый_объект — список, кортеж и т.д.
  • начальное_значение — опциональное начальное значение аккумулятора

Как работает reduce()?

numbers = [1, 2, 3, 4, 5]
result = reduce(lambda acc, x: acc + x, numbers)
Шаг 1: acc=1, x=2  → 3
Шаг 2: acc=3, x=3  → 6
Шаг 3: acc=6, x=4  → 10
Шаг 4: acc=10, x=5 → 15

Результат: 15

Аккумулятор (acc) накапливает результат на каждом шаге.


Базовые примеры

Сумма чисел

from functools import reduce

numbers = [1, 2, 3, 4, 5]

total = reduce(lambda acc, x: acc + x, numbers)
print(total)  # 15

# С начальным значением
total = reduce(lambda acc, x: acc + x, numbers, 10)
print(total)  # 25 (10 + 1 + 2 + 3 + 4 + 5)

Произведение чисел

numbers = [1, 2, 3, 4, 5]

product = reduce(lambda acc, x: acc * x, numbers)
print(product)  # 120

# Факториал
def factorial(n):
    return reduce(lambda acc, x: acc * x, range(1, n + 1), 1)

print(factorial(5))  # 120
print(factorial(0))  # 1

Практические примеры

Сглаживание списка (flatten)

nested = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

flattened = reduce(lambda acc, lst: acc + lst, nested, [])
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Суммирование значений словарей

sales = [
    {"product": "Phone", "revenue": 500},
    {"product": "Laptop", "revenue": 1200},
    {"product": "Mouse", "revenue": 25}
]

total_revenue = reduce(lambda acc, sale: acc + sale["revenue"], sales, 0)
print(total_revenue)  # 1725

Пайплайн функций

def add_10(x): return x + 10
def multiply_2(x): return x * 2
def square(x): return x ** 2

functions = [add_10, multiply_2, square]
result = reduce(lambda acc, func: func(acc), functions, 5)
# 5 → add_10 → 15 → multiply_2 → 30 → square → 900
print(result)  # 900

Комбинация reduce + map + filter

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Чётные → удвоить → сумма
result = reduce(
    lambda acc, x: acc + x,
    map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)),
    0
)
print(result)  # 60

# Пошагово:
# filter: [2, 4, 6, 8, 10]
# map:    [4, 8, 12, 16, 20]
# reduce: 4 + 8 + 12 + 16 + 20 = 60

Начальное значение

Начальное значение обязательно при работе с пустым списком или когда тип результата отличается от типа элементов:

# Пустой список без начального — ошибка!
result = reduce(lambda acc, x: acc + x, [])
# TypeError: reduce() of empty sequence with no initial value

# С начальным — OK
result = reduce(lambda acc, x: acc + x, [], 0)
print(result)  # 0

# Другой тип результата
numbers = [1, 2, 3, 4, 5]
result = reduce(
    lambda acc, x: {**acc, str(x): x ** 2},
    numbers,
    {}  # Начальное значение — словарь
)
print(result)  # {'1': 1, '2': 4, '3': 9, '4': 16, '5': 25}

Распространённые ошибки

Ошибка 1: Забыли импортировать

# ❌ ОШИБКА
result = reduce(lambda acc, x: acc + x, [1, 2, 3])
# NameError: name 'reduce' is not defined

# ✅ ПРАВИЛЬНО
from functools import reduce
result = reduce(lambda acc, x: acc + x, [1, 2, 3])

Ошибка 2: Функция не возвращает значение

def add_bad(acc, x):
    acc + x  # Забыли return!

result = reduce(add_bad, [1, 2, 3])
print(result)  # None

# ✅ ПРАВИЛЬНО
def add_good(acc, x):
    return acc + x

result = reduce(add_good, [1, 2, 3])
print(result)  # 6

Когда использовать reduce()

Используй reduce():
- Сложная логика свёртки (не просто сумма/max/min)
- Нестандартные операции над накопителем
- Пайплайн последовательных преобразований

Не используй reduce():
- Сумма → sum(numbers)
- Максимум/минимум → max() / min()
- Склеивание строк → "".join(words)

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Как функции работают вместе в Python 🧩

Небольшая функция обычно решает одну понятную задачу. Но настоящая программа состоит из нескольких задач: получить...

📅 09.08.2026 👁️ 78
📝

map() — Преобразуй каждый элемент!

Функция map() лениво применяет преобразование к каждому элементу итерируемого объекта.

📅 03.04.2026 👁️ 430
📝

filter() — Отбери нужное!

Функция filter() оставляет элементы, для которых проверка возвращает истинное значение.

📅 03.04.2026 👁️ 430

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!