Охватываемые темы: Что такое 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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!