Функція reduce() з вбудованого модуля Python functools – це інструмент функціонального програмування, який послідовно застосовує задану функцію до елементів ітерованого об’єкта, та накопичує результат (зводячи до єдиного акумульованого значення).

Синтаксис функції reduce() у Python:

from functools import reduce

reduce(function, iterable[, initializer])

Де:

  • function: функція, яка приймає два аргументи, виконує над ними певну операцію та повертає єдиний результат.
  • iterable: послідовність (наприклад, список, кортеж), елементи якої будуть оброблені.
  • initializer (необов’язковий): початкове значення. Якщо воно вказане, то передається як перший аргумент function під час першої ітерації. Якщо initializer не вказаний, то першими двома аргументами function стають перші два елементи послідовності iterable.

Принцип роботи функції reduce()

  • Якщо initializer вказано, reduce() викликає function з initializer та першим елементом iterable. Якщо ні, то reduce() викликає function з першими двома елементами iterable. Результат стає новим накопиченим значенням. 
  • Далі reduce() викликає function з цим новим накопиченим значенням та наступним елементом iterable.
  • Цей процес повторюється доки не будуть оброблені всі елементи iterable.
  • Якщо послідовність порожня і initializer не вказаний, виникає помилка TypeError. Якщо послідовність порожня, але initializer вказано, reduce() повертає значення initializer.

Практичні приклади використання функції reduce() у Python

Обчислення суми всіх елементів списку, з використанням lambda функції:

from functools import reduce

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

sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # 15

Те саме з використанням власної визначеної функції:

from functools import reduce

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


def add(x, y):
    return x + y


sum_of_numbers = reduce(add, numbers)
print(sum_of_numbers)  # 15

Приклад з ініціалізатором:

from functools import reduce

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

sum_of_numbers = reduce(lambda x, y: x + y, numbers, 10)
print(sum_of_numbers)  # 25

Пошук максимального елемента списку (по аналогії можна робити пошук мінімального елемента):

from functools import reduce

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

max_number = reduce(lambda x, y: x if x > y else y, numbers)
print(max_number)  # 9

Конкатенація списку рядків, хоча для цього ефективніше використовувати метод join():

from functools import reduce

words = ['Hello', ' ', 'Python', ' ', 'World', '!']

concatenated_string = reduce(lambda x, y: x + y, words)
print(concatenated_string)

# Hello Python World!

Обчислення загальної вартості товарів у кошику:

from functools import reduce

items = [
    {'name': 'Laptop', 'price': 1200},
    {'name': 'Mouse', 'price': 25},
    {'name': 'Keyboard', 'price': 75},
    {'name': 'Monitor', 'price': 300}
]

total_price = reduce(lambda total, item: total + item['price'], items, 0)
print(total_price)  # 1600

У цьому прикладі використовується initializer=0. Це має значення, оскільки перший акумульований аргумент для lambda функції в даному випадку має бути числом, а не словником.

Переваги використання функції reduce()

  • Лаконічність: для певних типів операцій (як правило кумулятивних), reduce() забезпечує більш короткий та виразний синтаксис, порівняно з традиційним циклом for.
  • Функціональний стиль: reduce() є прикладом функціонального підходу в Python, що дозволяє компактно виразити логіку обчислення, уникаючи проміжних змінних. Це підвищує читабельність і зменшує кількість коду при роботі з послідовностями.

Альтернативи використанню reduce() у Python

Незважаючи на переваги, використання reduce() не завжди є найкращим вибором:

  • Для простих операцій (як наприклад сумування чисел), краще використовувати вбудовану функцію sum(), вона проста та ефективна.
  • У деяких випадках більш доцільним є звичайний цикл for, наприклад коли логіка функції що передається в reduce() занадто складна.

Мітки: