Рубрики
Без рубрики

Идет функционал 3 – фильтр и уменьшить

Добро пожаловать в часть 3 серии #goingfunctional. После того, как мы остановились, мы рассмотрим … Помечено с помощью посторонней, Haskell, Python.

Добро пожаловать в часть 3 серии #goingfunctional.

После того, как мы остановились, мы рассмотрим еще два операция, которые оба важны (в том смысле их можно рассматривать как строительные блоки для написания функционального кода) и полезны (так как они очень хорошо переводятся в бизнес-требования) для отраслевых программистов. Они Уменьшить и Фильтр Отказ

Вместе с картой и функциями лямбда они предоставляют почти «рамки» на Функционализируйте Ваша кодовая база, и это стоит знать, поскольку он делает вашу кодовую базу более читаемой, более современным и в целом проще работать с.

Фильтр

Так же, как имя указывает, Фильтр это конструкция, которая позволяет использовать один фильтр на рассмотрении на основе определенного фильтра. Вот так:

  filter (\x -> x>3) ([1,2,3,4,5])
=> [4,5]

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

В Python (2 или ниже только), тот же код, что и выше, может быть записан как:

>>> filter(lambda x: x>3, [1,2,3,4,5])
[4, 5]
>>> 

В Python 3+, такие операции, как карта, фильтр, уменьшение и т. Д., Определяются как возвращение итератора (см. Здесь , чтобы узнать об этом), что означает, что для того, чтобы получить тот же список в результате, вы должны сделать:

Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> list(filter(lambda x: x>3, [1,2,3,4,5]))
[4, 5]
>>> 

Оборачивая полученный итератор в вызове конструктора списка, итератор будет реализован в список, и мы получаем то же поведение, что и в Python 2.

Идея фильтрации, затем тестирует каждый элемент списка против функции и сохраняет только элементы, которые проходят тест.

Эта функция называется, в жаргон, а предикат , что является специализированным именем для функции, которая должна вернуть логию.

Это имеет смысл для нашего случая, поскольку только элементы, которые проходят тест предиката, хранятся в списке, поэтому время возврата функции, используемой в конструкции фильтра, является Требуется быть логией.

Это включает в себя все возможные комбинации фильтров, а также логических операторов, которые являются результатом и/или комбинацией в булеве: и, или, а не, XOR, любая комбинация этих операторов, а также более специализированные методы, например, проверка, если Свойство объекта соответствует критериям фильтрации ( getCArcolor (). Содержит («желтый») ) или, например, проверка, если список объектов соответствует определенному типу экземпляра. Что-нибудь идет, пока мы получаем логию в результате.

Это сила математической абстракции на работе.

Уменьшать

Следующая концепция, о которой мы поговорим о это Уменьшить Отказ Мне кажется, что люди много боролись с этой конкретной концепцией, например, парень, разработчик DEV.TO потратил весь день с этим Так что увлекается тем, чтобы исследовать это в глубине. Давайте начнем с определения из одного истинного источника (: D) haskellwiki:

В функциональном программировании сгибается (или уменьшение) является семейством функций высшего порядка, которые обрабатывают структуру данных в некотором порядке и создают возвращаемое значение. Это в отличие от семейства разворотных функций, которые принимают начальное значение и применяют его к функции для создания структуры данных. Как правило, складки с двумя вещами: объединение функции и структура данных, как правило, список элементов. Затем сгибается, чтобы объединить элементы структуры данных, используя функцию некоторого систематического способа.

Это называется Уменьшить Поскольку идея состоит в том, чтобы систематически применять функцию, начиная с значения семян, до тех пор, пока не будет исчерпываемый объект, или уменьшено к одному значению.

Типичные примеры включают суммирование всех элементов в списке, а также, например, умножение всех элементов в списке.

Суммирующие элементы

При накапливании элементов с операцией суммирования, если мы хотим получить сумму всех элементов в неиспользуемой, нам необходимо обеспечить 0 в качестве значения идентичности, чтобы начать наше сокращение.

Личность должна быть равна для каждого отдельного элемента, и ясно, что для любого целого числа X у нас есть что:

0 + х + 0

Мы говорим, что 0 – значение идентичности для нашей функции аккумулятора, которая также ассоциативна.

Мы можем объединить это с Фильтр Операция Мы только что узнали, чтобы суммировать все даже значения в списке, что в Python очень аккуратно:

>>> reduce(lambda x,y: x+y, filter(lambda x: x%2==0,[1,2,3,4,5,6,7,8,9,10]), 0)
30
>>> 

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

Умновидение элементов

При накапливании элементов с операцией умножения, если мы хотим получить сумму всех элементов в результате, нам необходимо предоставить 1 в качестве значения удостоверения личности, чтобы начать наше сокращение. Очитывающе, давайте посмотрим, что произойдет, когда мы сделаем не Укажите значение по умолчанию при умножении:

>>> reduce(lambda x,y: x*y, [2,4,6])
48
>>> 

Поскольку мы не предоставили значение по умолчанию, разворачивая, что уменьшение выглядит как:

2*(4*(6))

При предоставлении значения по умолчанию в качестве идентичности мы получаем тот же эффект, за исключением того, что идентичность умножает первый элемент для «отключения» уменьшения:

>>> reduce(lambda x,y: x*y, [2,4,6],2)
96
>>> 

2*(2*(4*(6)))

Приложения в реальном мире

Эти операции очень полезны и, как и предыдущие, на которых мы смотрели, они очень хорошо составляют с множеством разных бизнес-доменов, примеры включают в себя:

  • Суммируя все зарплаты сотрудников, которые были с компанией более года

  • Подсчет количества заказов, которые были отправлены в определенный день

  • Количество узлов в графе, который удерживает определенное значение

  • И еще много примеров …

Выводы

Надеюсь, вам понравилось читать и узнать больше о сокращении и фильтрации ваших данных и ваших объектов, чтобы сделать ваш код более читаемым и поддерживаемым.

В следующий раз мы посмотрим на последнее обследование операций по снижению, о бесконечном (!!) Структуры данных, ленивая оценка и то, как она меняет способ посмотреть на ваши данные.

Оригинал: “https://dev.to/brunooliveira/going-functional-3-filter-and-reduce-aap”