Аналог функции map python

Малоизвестные функции Python

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

Функция filter

Функция filter предназначена для «фильтрации» массива и может заменить цикл. Filter работает быстрее цикла, в некоторых случаях скорость работа программы увеличивается в десятки раз при использовании filter, вместо классических циклов.

Функция filter принимает на вход:

  1. Другую функцию, которая возвращает True или False
  2. Cписок, элементы которого будут подаваться на вход функции

В функции, передаваемой в filter, должно содержатся условие, которое определяет критерии для элементов нового массива. Если функция возвращает True — элемент добавляется в новый массив, если False — элемент не добавляется.

Функция filter возвращает объект класса Filter, используйте list(), чтобы переделать его в массив.

Filter поможет вам сделать код более оптимизированным и читаемым.

Например, вам дан массив a, надо все числа, которые меньше 10, записать в массив b и вывести его на экран.
Как это выглядит без использования filter:

a = [1, 10, 24, 6, 8, 19] b = [] for i in range(len(a)): if a[i] < 10: b.append(a[i]) print(b)

Если использовать filter, то это выглядит так:

a = [1, 10, 24, 6, 8, 19] b = list(filter(lambda x: x< 10, a)) print(b)

Код выглядит лаконичнее и работает быстрее.

Функция map

Функцией map, так же как и функцией filter, можно заменить циклы. Циклы работают медленнее чем map, но не каждый цикл можно заменить на map.

Функция map, принимает на вход:

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

Функция map позволяет сделать код красивее и ускорить его работу.

ля примера возьмем проблему, которая часто встречается у меня. Вам необходимо прочитать с клавиатуры 5 чисел, введённых через пробел и вывести их сумму на экран. Так как с клавиатуры читается строка, а не числа, необходимо их всех преобразовывать в числа.

Пример без использования map:

a = input().split(" ") b = [] for i in range(5): b.append(int(a[i])) print(b[0]+b[1]+b[2]+b[3]+b[4])

Программа с использованием map:

a = list(map(int, input().split(" "))) print(a[0]+a[1]+a[2]+a[3]+a[4])

Программа с использованием map имеет меньший размер и работает быстрее, но ее можно сделать еще более быстрой с помощью следующей функции.

Функция reduce

Функция reduce работает так же как map, но reduce возвращает лишь одно значение которое получается из последнего выполнения переданной функции. Перед использованием reduce, его необходимо импортировать из модуля functools.

Функция reduce получает на вход:

  1. Функцию, которая получает более одно значения
  2. Массив, элементы которого будут поданы на вход функции

Reduce предает на вход функции элемент массива и выход предыдущего выполнения, при первом выполнении в функцию передаются первые элементы массива.

Для примера возьмем проблему которую рассматривали в прошлый раз.

a = list(map(int, input().split(" "))) print(a[0]+a[1]+a[2]+a[3]+a[4])

Пример с использованием reduce:

from functools import reduce def summa(a, b): return a+b print(reduce(summa, list(map(int, input().split(" ")))))

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

Множества

Множества это тип данных который работает быстрее остальных, но не может иметь повторяющихся элементов. Для создания множества используется функция set(), которой передается строка, массив, и так далее. Множества имеют методы и новые операторы:

  1. add() - добавление элемента в множество
  2. discard() - удаление элемента из множества
  3. union() - объединяет множество, из которого вызывается функция, с тем которое передается как аргумент
  4. intersection() - находит пересечение множеств, из которого вызывается, с тем которое передается как аргумент
  5. difference() - находит все элементы которые есть в множестве, из которого вызывают функцию, но которых нет в множестве переданном как аргумент
  6. symmetric_difference() - выдает множество, которое содержит все элементы из двух множеств, за исключением их общих элементов
  7. isdisjoint() - выдает True если оба множества не имею общих элементов, и False если имеют
  8. | - то же самое, что union
  9. & - то же самое, что intersection
  10. -(минус) - то же самое, что difference
  11. ^ - то же самое, что symmetric_difference

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

Функции any и all

Функции any и all используются вместо операторов OR и AND. Они позволяют сократить ваш код и сделать его более читаемым, в тех случаях когда вы используете большое количество условий в своей программе.

Они оба принимают массив из условий или булевых значений как аргумент, и возвращают одно булево значение.

Any - заменяет собой оператор OR, если в аргументах есть хотя бы одно True, на выходе будет True.

All - заменяет собой оператор AND, если в аргументах будет хотя бы один False, ответ будет False.

Для примера возьмем программу, которая должна вывести "1", если есть одинаковые переменные, и "-1", если таковых нет. Потом она должна проверить равна ли первая переменная второй и вторая третей, если это так вывести "2".

a = input() b = input() c = input() d = input() if (a == b) OR (a == c) OR (a == d) OR (b == c) OR (b == d) OR (c == d): print("1") else: print("-1") if (a==b) AND (c == d): print("2")

Пример с использованием any и all:

a = input() b = input() c = input() d = input() if any([(a == b), (a == c), (a == d), (b == c), (b == d), (c == d)]): print("1") else: print("-1") if all([(a==b), (c == d)]): print("2")

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

На этом все, я надеюсь вы узнали что-то новое. Если я что-то пропустил, то пишите в комментариях, если там будет много малоизвестных фишек Python, то я выпущу вторую часть.

Источник

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

30 октября 2017 г. Archy Просмотров: 21582 RSS 1
Общие вопросы » Python для начинающих all, any, filter, lambda, map, reduce

Современные альтернативы функциям 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.

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

Источник

Читайте также:  Как распарсить string java
Оцените статью