Топ-3 функции Python, о которых вы не знали (Наверное)
Привет, Хабр! Представляю вашему вниманию перевод статьи «Top 3 Python Functions You Don’t Know About (Probably)» автора Dario Radečić.

Будучи одним из самых популярных языков 21-го века, Python, безусловно, обладает множеством интересных функций, которые стоит изучить подробно. Три из них будут рассмотрены сегодня, каждая — теоретически, а потом и на практических примерах.

image

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

Вот функции, которые будут рассмотрены в статье:

1. map()
2. filter()
3. reduce()

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

Итак, без лишних слов… Давайте начнем!

map()


Функция «map()» принимает в качестве параметра другую функцию наряду с каким-либо массивом. Идея состоит в том, чтобы применить функцию (переданную в качестве аргумента) к каждому элементу в массиве.

Это пригодится по двум причинам:

  1. Вам не нужно писать цикл
  2. Это быстрее, чем цикл

Давайте посмотрим на это в действии. Я объявлю функцию «num_func()», которая принимает одно число в качестве параметра. Это число возводится в квадрат, делится на 2 и возвращается как таковое. Обратите внимание, что операции были выбраны произвольно, вы можете делать все что угодно внутри функции:

image

А теперь давайте объявим массив чисел, к которому мы хотим применить «num_func()». Обратите внимание, что «map()» сама вернет объект карты, поэтому вам необходимо преобразовать его в список:

image

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

filter()


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

Как и в случае с «map()», мы можем заранее объявить функцию, а затем передать ее в «filter()» вместе со списком итераций.

Давайте посмотрим на это в действии. Я пошел дальше и объявил функцию «more_than_15 ()», которая, как следует из названия, вернет «true», если элемент, заданный в качестве параметра, больше 15:

image

Далее мы объявляем массив чисел и передаем их в качестве второго параметра в функцию «filter()»:

image

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

reduce()


Теперь «reduce()». Она немного отличается от предыдущих двух. Для начала мы должны импортировать его из модуля functools. Основная идея заключается в том, что она будет применять данную функцию к массиву элементов и в результате будет возвращать одно значение.

Последняя часть имеет решающее значение — «reduce()» не возвращает массив элементов, он всегда возвращает одно значение. Давайте посмотрим на схему, чтобы конкретизировать эту концепцию:

image

Вот логика, написанная на случай, если диаграмма не ясна на 100%:

  1. 5 добавляется к 10, результаты в 15
  2. 15 добавляется к 12, результаты в 27
  3. 27 добавляется к 18, результат 45
  4. 45 добавляется к 25, результат 70

И 70 это значение, которое возвращается. Чтобы начать с реализации кода, давайте импортируем функцию уменьшения из модуля functools и объявим функцию, которая возвращает сумму двух чисел:

image

Теперь мы можем вернуться к диаграмме в коде и убедиться, что все работает как надо:

image

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

Прежде, чем вы уйдете:


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

Если у вас есть другие примеры, не стесняйтесь поделиться ими в разделе комментариев.

Спасибо за прочтение.