Использование метода редукции в Python
Python’s reduce(): от функционального до питонического стиля
Python’s reduce()
- это функция, которая реализует математический метод, называемый сворачиванием или сокращением. reduce()
полезна, когда нужно применить функцию к итерируемому объекту и свернуть его до одного накопительного значения. reduce()
в Python популярна среди разработчиков, знакомых с функциональным программированием, но Python предлагает гораздо больше.
В этом учебнике вы узнаете:
- Как работает
reduce()
в Python - Какие наиболее распространенные случаи использования свертки
- Как решить эти случаи использования с помощью
reduce()
- Какие альтернативные инструменты Python доступны для решения этих же случаев использования
Имея такие знания, вы сможете определить, какие инструменты использовать для решения задач свертки или сокращения в Python.
Разработка функционального программирования в Python
В функциональном программировании функции не имеют внутреннего состояния, которое влияет на вывод, который они производят для заданного ввода. Это означает, что при каждом вызове функции с одним и теми же входными аргументами вы получите тот же результат или вывод.
В функциональной программе входные данные протекают через набор функций. Каждая функция работает с входными данными и производит какой-то вывод. Функциональное программирование старается избегать изменяемых типов данных и изменений состояния насколько это возможно. Оно работает с данными, которые перетекают между функциями.
Другие основные особенности функционального программирования включают:
- Использование рекурсии вместо циклов или других структур в качестве основной структуры управления потоком выполнения
- Фокус на обработке списков или массивов
- Фокус на чем нужно сделать вычисления, а не как это сделать.
- Использование чистых функций, которые не имеют побочных эффектов и всегда возвращают одинаковый результат для одного и того же набора входных данных.
Функциональное программирование имеет много преимуществ, включая лучшую модульность, возможность повторного использования кода и лучшую возможность тестирования. К счастью, Python предлагает множество инструментов и способов для реализации функционального программирования.
Начало работы с reduce()
в Python
Для начала импортируйте reduce()
из модуля functools
:
reduce()
принимает два обязательных аргумента - функцию и итерируемый объект:
Функция будет применена к первым двум элементам итерируемого объекта, затем к результату и следующему элементу, и так далее, пока не останется только одно значение.
Обязательные аргументы: функция и итерируемый объект
Функция, передаваемая в reduce()
, должна принимать два аргумента и возвращать одно значение. Она будет применена последовательно к элементам итерируемого объекта.
Итерируемый объект может быть списком, кортежем или любым другим итерируемым объектом.
В этом примере function
применяется к парам элементов списка numbers
по очереди:
function(1, 2)
- результат1function(результат1, 3)
- результат2function(результат2, 4)
- результат3function(результат3, 5)
- итоговый результат
Необязательный аргумент: инициализатор
У reduce()
есть необязательный второй аргумент, который называется инициализатор. Этот аргумент представляет собой начальное значение, которое будет использоваться в первой итерации вместо первых двух элементов итерируемого объекта.
Если вы не указываете инициализатор, reduce()
использует первые два элемента итерируемого объекта в качестве начального значения. Однако, если итерируемый объект пуст, и вы не указываете инициализатор, reduce()
вызовет исключение TypeError
.
Чтобы избежать возникновения исключения, вы можете передать инициализатор в reduce()
:
Сокращение итерируемых объектов с помощью reduce()
в Python
Теперь, когда вы знакомы с основами использования reduce()
, мы можем рассмотреть некоторые примеры того, как применять сокращение к различным итерируемым объектам.
Суммирование числовых значений
Предположим, у вас есть список чисел, и вы хотите найти их сумму с помощью reduce()
:
В этом примере мы используем лямбда-функцию, чтобы сложить два числа в каждой итерации. Начальное значение - первые два элемента списка.
Умножение числовых значений
Теперь предположим, что у вас есть список чисел, и вы хотите найти их произведение с помощью reduce()
:
Также мы используем лямбда-функцию, чтобы умножить два числа в каждой итерации.
Поиск минимального и максимального значения
Еще одна полезная задача - найти минимальное или максимальное значение в списке:
В этом примере мы используем лямбда-функции, чтобы сравнивать каждый элемент с предыдущим минимальным или максимальным значением.
Проверка наличия всех и любого истинного значения
С помощью reduce()
также можно проверить, все ли значения в списке являются истинными или есть ли вообще хотя бы одно истинное значение:
В этом примере мы используем лямбда-функции, чтобы выполнить логическое И (and) или ИЛИ (or) между каждым элементом списка и предыдущим результатом.
Сравнение reduce()
и accumulate()
accumulate()
- это еще одна полезная функция Python, которая выполняет накопление (аккумуляцию) значений в итерируемом объекте посредством применения функции.
accumulate()
в отличие от reduce()
возвращает все промежуточные результаты, а не только конечный. Это полезно, если вам нужно иметь доступ ко всем промежуточным результатам или если вы хотите поэлементно просмотреть процесс накопления.
В этом примере мы используем accumulate()
и лямбда-функцию, чтобы найти сумму чисел на каждом шаге накопления. Результатом будет список всех сумм за каждый шаг.
Учет производительности и читаемости
При использовании reduce()
и других инструментов Python важно учитывать как производительность, так и читаемость вашего кода.
Производительность
Хотя reduce()
является мощным инструментом, при его многократном использовании в больших итерируемых объектах может возникнуть проблема производительности. В таких случаях может быть более эффективным использовать цикл for
или списковые выражения.
Читаемость
Ваш код должен быть читаемым и понятным. Если использование reduce()
ухудшает читаемость вашего кода, то стоит рассмотреть другие альтернативные инструменты, которые могут быть более понятными для вас и других разработчиков.
Заключение
В этом учебнике вы изучили, как использовать reduce()
в Python и какие альтернативные инструменты доступны для решения задач свертки или сокращения. Вы также рассмотрели некоторые примеры использования reduce()
для различных случаев использования, таких как суммирование или умножение числовых значений, поиск минимального и максимального значения и проверка на наличие истинных значений.
Теперь у вас есть навыки и знания, чтобы эффективно использовать reduce()
и принимать информированные решения о том, когда лучше использовать reduce()
, а когда лучше воспользоваться другими инструментами Python.