Функция 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
func — Функция, которую требуется применить к элементам последовательности. Должна принимать два аргумента, где первый аргумент — аккумулированное ранее значение, а второй — следующий элемент последовательности.
iterable — Последовательность, элементы которой требуется свести к единственному значению. Если последовательность пуста и не задан initializer, то возбуждается TypeError.
initializer=None — Базовое значение, с которого требуется начать отсчёт. Оно же будет возвращено, если последовательность пуста.
def reducer_func(el_prev, el):
# el_prev - предшествующий элемент
# el - текущий элемент
return el_prev + el
# python 2
reduce(reducer_func, [1, 2, 3]) # 6
# python 3
from functools import reduce
reduce(reducer_func, [1, 2, 3]) # 6
На заметку
Python 3 Настоятельно рекомендуется использовать обычный проход по элементам при помощи for для повышения читаемости кода. Если функция всё же требуется, то её можно найти в functools.reduce().
Функция reduce
reduce уменьшает Iterable путем применения функции повторно на следующем элементе iterable и совокупный результате до сих пор.
def add(s1, s2): return s1 + s2 asequence = [1, 2, 3] reduce(add, asequence) # equivalent to: add(add(1,2),3) # Out: 6
В этом примере мы определили собственную add функции. Однако, Python поставляется со стандартной эквивалентной функцией в operator модуле:
import operator reduce(operator.add, asequence) # Out: 6
reduce также могут быть переданы начальное значение:
reduce(add, asequence, 10) # Out: 16
Используя уменьшить
def multiply(s1, s2): print(' * = '.format(arg1=s1, arg2=s2, res=s1*s2)) return s1 * s2 asequence = [1, 2, 3]
Дан initializer функция запускается, применяя его к инициализатору и первому Iterable элементу:
cumprod = reduce(multiply, asequence, 5) # Out: 5 * 1 = 5 # 5 * 2 = 10 # 10 * 3 = 30 print(cumprod) # Out: 30
Без initializer параметра reduce начинается путем применения функции к первым двум элементам списка:
cumprod = reduce(multiply, asequence) # Out: 1 * 2 = 2 # 2 * 3 = 6 print(cumprod) # Out: 6
Накопительный продукт
import operator reduce(operator.mul, [10, 5, -3]) # Out: -150
Вариант без короткого замыкания любой / все
reduce не прекращает итерацию до iterable были укомплектовать итерации , поэтому он может быть использован для создания нон короткого замыкания any() или all() функции:
import operator # non short-circuit "all" reduce(operator.and_, [False, True, True, True]) # = False # non short-circuit "any" reduce(operator.or_, [True, False, False, False]) # = True
Что делает метод 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
