Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Язык программирования Python. Функция высшего порядка reduce (модуль functools)

Все ссылки на статьи и ролики моего канала Old Programmer:
Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои материалы о языке программирования Python. В прошлой статье мы уже говорили о функциях высшего порядка map и filter. Заметим, что использование этих функций избавляет программиста от применения циклических конструкций, что сокращает код и ускоряет его выполнение. Сегодня продолжаем рассматривать основы функционального программирования в Python. Функциональное программирование в языке Python Сегодня говорим о функции reduce. Она находится в модуле functools. Функция reduce() принимает три аргумента (третий не обязателен). Первым аргументом является функция, часто lambda-функция. Второй аргумент - итератор. Два аргумента функции, являющейся первым аргументом, обозначают элементы итератора. Первый аргумент - первый элемент итератора, второй аргумент - следующий элемент. Сама функция reduce возвращает одно значение. Рассмотрим примеры.

Все ссылки на статьи и ролики моего канала Old Programmer:
Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои материалы о языке программирования Python.

В прошлой статье мы уже говорили о функциях высшего порядка map и filter. Заметим, что использование этих функций избавляет программиста от применения циклических конструкций, что сокращает код и ускоряет его выполнение. Сегодня продолжаем рассматривать основы функционального программирования в Python.

  • Список разделов канала Old Programmer, канала о программировании и программистах

Функциональное программирование в языке Python

Сегодня говорим о функции reduce. Она находится в модуле functools. Функция reduce() принимает три аргумента (третий не обязателен). Первым аргументом является функция, часто lambda-функция. Второй аргумент - итератор. Два аргумента функции, являющейся первым аргументом, обозначают элементы итератора. Первый аргумент - первый элемент итератора, второй аргумент - следующий элемент. Сама функция reduce возвращает одно значение. Рассмотрим примеры.

from functools import reduce
ls = [1, 2, 3, 4, 5, 6]
sm = reduce(lambda x,y: x * y, ls)
print(sm)

Данный пример вычисляет последовательное произведение всех элементов списка. Результат выполнения 720. Для получения суммы всех элементов списка просто заменим знак умножения на знак сложения. Смысл вычисления очень прост: переменная y пробегает все значения элементов списка, кроме первого. А x принимает вычисляемое значение. В начале значения x принимает значение равное первому элементу списка. Если третий параметр reduce отличен от None, то начальное значение y равно первому элементу списка, а x в начале как раз равно этому параметру.

from functools import reduce
ls = [1, 6, 3, 4, 5, 2]
m = reduce(lambda x,y: x if x>y else y, ls)
print(m)

Также легко (см. фрагмент выше) вычислить, например, максимальное значение элементов списка.

from functools import reduce
ls = [1, 2, 3, 4, 5, 6]
mm = []
reduce(lambda x,y: mm.append(y) if y < 3 else None, ls, 1)
print(mm)

Но с помощью reduce можно смоделировать и другие функции высшего порядка. Смотрим фрагмент выше, который фактически воспроизводит работу функции filter. Здесь возвращаемое значение нам не нужно, для генерации нового списка нам понадобится список пустой (mm). Тут важен вот какой момент. У reduce появляется третий аргумент. Это начальное значение для x (который мы и не используем), но при этом y будет пробегать уже все значения списка.

Подписываемся на мой канал Old Programmer. Успехов в программировании.

Список разделов канала Old Programmer, канала о программировании и программистах.