Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Современные альтернативы функциям map, filter и reduce в Python

30 октября 2017 г. Archy Просмотров: 23700 RSS 1
Общие вопросы » Python для начинающих , , , , ,
Современные альтернативы функциям map, filter и reduce в Python

В функциональных языках программирования обычно имеются функции высокого порядка map, filter и reduce(иногда под другими именами).

Функции map и filter по-прежнему встроены в Python 3, но с появлением списковых включений и генераторных выражений потеряли былую значимость. Как списковое включение, так и генераторное выражение могут сделать то же, что комбинация map и filter, только код будет выглядеть понятнее.

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

def factorial(n):
    return 1 if n < 2 else n * factorial(n-1)
>>> list(map(factorial, range(6))) # (1)
[1, 1, 2, 6, 24, 120]
>>> [factorial(n) for n in range(6)] # (2)
[1, 1, 2, 6, 24, 120]
>>> list(map(factorial, filter(lambda n: n % 2, range(6)))) # (3)
[1, 6, 120]
>>> [factorial(n) for n in range(6) if n % 2] # (4)
[1, 6, 120]
>>>

1.Строим список факториалов от 0! до 5!.

2. Та же операция с помощью спискового включения.

3. Список факториалов нечетных чисел до 5!, построенный с использованием map и filter.

4. Списковое включение делает то же самое, заменяя map и filter и делая ненужным лямбда-выражение.

В Python 3 функции map и filter возвращают генераторы - вариант итератора - поэтому безо всяких проблем могут быть заменены генераторным выражением(в Python 2 эти функции возвращали списки, поэтому их ближайшим аналогом было списковое включение).

Функция reduce, которая в Python 3 была встроенной, теперь "понижена в звании" и перенесена в модуль functools. В той ситуации, где она чаще всего применялась, а именно для суммирования, удобнее встроенная функция sum, включенная в версию Python 2.3 в 2003 году.

Разработчики программы Adobe After Effects на одну конференцию в прошлом признались что в процессе разработки кода они часто использовали функцию reduce.

Сейчас After Effects считается лучшей программой для создания промо-роликов наподобие web hosting explainer. Если вам интересно можете зайти на популярном сайте hunterae.com и найти там больше информации о After Effects.

Она дает большой выйгрыш в плане удобочитаемости и производительности, например, далее мы будем суммировать целые числа до 99 с помощью reduce и sum:

>>> from functools import reduce # (1)
>>> from operator import add # (2)
>>> reduce(add, range(100)) # (3)
4950
>>> sum(range(100)) # (4)
4950
>>>

1. Начиная с Python 3.0, функция reduce больше не является встроенной.

2. Импортируем модуль add, чтобы не создать функцию для сложения двух чисел.

3. Вычисляем сумму целых чисел, не больших 99.

4. Решение той же задачи с помощью функции sum, импортировать функцию сложения больше не нужно.

Общая идея функций sum и reduce - применить некую операцию к каждому элементу последовательности с аккумулированием результатов и тем самым свести(редуцировать) последовательность значений к одному.

Редуцирующими являются также встроенные функции all и any:

all(Iterable) - возвращает True, если каждый элемент объекта Iterable похож на истинный, например all([]) возвращает True.

any(Iterable) - возвращает True, если хотя бы один элемент объекта Iterable похож на истинный, например any([]) возвращает False.

Советуем вам следующее видео к просмотру:

Комментариев: 1
  1. Александр | 2021-08-31 в 13:28:29

    Видео не отображается