Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

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

30 октября 2017 г. Archy Просмотров: 286 RSS Обсудить
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.

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

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)