Что делает reduce в программировании
Перейти к содержимому

Что делает reduce в программировании

  • автор:

Что делает reduce в программировании

Метод reduce выполняет терминальные операции сведения, возвращая некоторое значение — результат операции. Он имеет следующие формы:

Optional reduce(BinaryOperator accumulator) T reduce(T identity, BinaryOperator accumulator) U reduce(U identity, BiFunction accumulator, BinaryOperator combiner)

Первая форма возвращает результат в виде объекта Optional . Например, вычислим произведение набора чисел:

import java.util.stream.Stream; import java.util.Optional; public class Program < public static void main(String[] args) < StreamnumbersStream = Stream.of(1,2,3,4,5,6); Optional result = numbersStream.reduce((x,y)->x*y); System.out.println(result.get()); // 720 > >

Объект BinaryOperator представляет функцию, которая принимает два элемента и выполняет над ними некоторую операцию, возвращая результат. При этом метод reduce сохраняет результат и затем опять же применяет к этому результату и следующему элементу в наборе бинарную операцию. Фактически в данном случае мы получим результат, который будет равен: n1 op n2 op n3 op n4 op n5 op n6 , где op — это операция (в данном случае умножения), а n1, n2, . — элементы из потока.

Затем с помощью метода get() мы можем получить собственно результат вычислений: result.get()

Или еще один пример — объединение слов в предложение:

Stream wordsStream = Stream.of("мама", "мыла", "раму"); Optional sentence = wordsStream.reduce((x,y)->x + " " + y); System.out.println(sentence.get());

Вторая версия метода reduce() принимает два параметра:

T reduce(T identity, BinaryOperator accumulator)

Первый параметр — T identity — элемент, который предоставляет начальное значение для функции из второго параметра, а также предоставляет значение по умолчанию, если поток не имеет элементов.

Второй параметр — BinaryOperator accumulator , как и первая форма метода reduce, представляет ассоциативную функцию, которая запускается для каждого элемента в потоке и принимает два параметра. Первый параметр представляяет промежуточный результат функции, а второй параметр — следующий элемент в потоке. Фактически код этого метода будет равноценен следующей записи:

T result = identity; for (T element : this stream) result = accumulator.apply(result, element) return result;

То есть при первом вызове функция accumulator в качестве первого параметра принимает значение identity, а в качестве второго параметра — первый элемент потока. При втором вызове первым параметром служит результат первого вызова функции accumulator, а вторым параметром — второй элемент в потоке и так далее. Например:

Stream numberStream = Stream.of(-4, 3, -2, 1); int identity = 1; int result = numberStream.reduce(identity, (x,y)->x * y); System.out.println(result); // 24

Фактически здесь выполняется следующая цепь операций: identity op n1 op n2 op n3 op n4.

В предыдущих примерах тип возвращаемых объектов совпадал с типом элементов, которые входят в поток. Однако это не всегда удобно. Возможно, мы захотим возвратить результат, тип которого отличается от типа объектов потока. Например, пусть у нас есть следующий класс Phone, представляющий телефон:

class Phone < private String name; private int price; public Phone(String name, int price)< this.name=name; this.price=price; >public String getName() < return name; >public int getPrice() < return price; >>

И мы хотим найти сумму цен тех телефонов, у которых цена меньше определенного значения. Для этого используем третью версию метода reduce:

Stream phoneStream = Stream.of(new Phone("iPhone 6 S", 54000), new Phone("Lumia 950", 45000), new Phone("Samsung Galaxy S 6", 40000), new Phone("LG G 4", 32000)); int sum = phoneStream.reduce(0, (x,y)-> < if(y.getPrice()<50000) return x + y.getPrice(); else return x + 0; >, (x, y)->x+y); System.out.println(sum); // 117000

Опять же здесь в качестве первого параметра идет значение по умолчанию — 0. Второй параметр производит бинарную операцию, которая получает промежуточное значение — суммарную цену текущего и предыдущего телефонов. Третий параметр представляет бинарную операцию, которая суммирует все промежуточные вычисления.

Функция reduce() в Python

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

Аргумент function это функция которую требуется применить к элементам последовательности. Должна принимать два аргумента, где первый аргумент — аккумулированное ранее значение, а второй аргумент следующий элемент последовательности.

Аргумент iterable представляет собой последовательность, элементы которой требуется свести к единственному значению. Если последовательность пуста и не задан аргумент initializer , то возбуждается исключение TypeError .

Например reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) вычисляет ((((1 + 2) +3) +4) +5) . Левый аргумент x — это накопленное значение, а правый аргумент y — это следующий элемент iterable .

Если присутствует необязательный initializer , он помещается перед элементами iterable в вычислении. Другими словами это базовое значение, с которого требуется начать отсчёт. Аргумент initializer , так же служит значением по умолчанию, когда iterable является пустым.

Функция reduce() эквивалентна следующему коду:

def reduce(function, iterable, initializer=None): it = iter(iterable) if initializer is None: value = next(it) else: value = initializer for element in it: value = function(value, element) return value 
Примеры использования:

Вычисление суммы всех элементов списка при помощи reduce:

>>> from functools import reduce >>> items = [10, 20, 30, 40, 50] >>> sum_all = reduce(lambda x,y: x + y, items) >>> sum_all # 150 

Вычисление наибольшего элемента в списке при помощи reduce:

>>> from functools import reduce >>> items = [1, 24, 17, 14, 9, 32, 2] >>> all_max = reduce(lambda a,b: a if (a > b) else b, items) >>> all_max # 32 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Способы использования модуля functools
  • Декоратор @cached_property модуля functools
  • Функция cmp_to_key() модуля functools
  • Декоратор @cache() модуля functools, кеширующий декоратор
  • Декоратор @lru_cache() модуля functools
  • Декоратор @total_ordering модуля functools
  • Функция partial() модуля functools
  • Класс partialmethod() модуля functools
  • Функция reduce() модуля functools
  • Декоратор @singledispatch модуля functools
  • Декоратор @singledispatchmethod модуля functools
  • Декоратор @update_wrapper() модуля functools
  • Декоратор @wraps() модуля functools

Что делает метод reduce python?

reduce — это функция из встроенного модуля functools .

Сигнатура функции: reduce(function, iterable[, initializer]) .

Принимает функцию для двух аргументов, итерабельный объект и необязательный initializer — аккумулирующее значение (по умолчанию равен первому элементу iterable).

from functools import reduce reduce(lambda x, y: x + y, range(4), 3) # то же самое что (((3+1)+2)+3) # 9 def get_maximum(first_num, second_num): return first_num if first_num > second_num else second_num reduce(get_maximum, [2, 3, 5, 4, 1]) # 5 

Что делает метод reduce js?

Основная суть метода reduce() — свести какие то данные из массива к одному значению. Данный метод хорошо подходит для ситуаций когда нужно обработать массив — например посчитать значения внутри и получить это значение. Для каждого элемента исходного массива вызывается указанная функция в которую передаются текущий элемент массива и переменная-аккумулятор, в которую мы сохраняем результат выполнения функции, и которая в итоге возвращается как финальный результат.

// Корзина товаров на сайте const cart = [ name:'Milk', price: 25>, name:'Bread', price: 12>, name:'Eggs', price: 17>, ]; // Как просто посчитать сумму всей корзины? Применим reduce(): const cartTotal = cart.reduce((totalSumm, item) =>  totalSumm += item.price; // мы всегда должны возвращать аккумулятор как результат работы над каждым элементом. return totalSumm; // 0 - здесь, это начальное значение totalSumm. >, 0); console.log(cartTotal); // -> 54 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *