Что делает 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