Будучи одним из самых популярных языков 21-го века, Python, безусловно, обладает множеством интересных функций, которые стоит изучить подробно. Три из них будут рассмотрены сегодня, каждая — теоретически, а потом и на практических примерах.
Основная причина, по которой я хочу рассказать эти про функции, заключается в том, что они помогают избежать написания циклов. Циклы могут быть затратными в некоторых случаях, и, кроме того, эти функции помогут увеличить скорость.
Вот функции, которые будут рассмотрены в статье:
1. map()
2. filter()
3. reduce()
Даже если вы уже слышали об этих функциях, нет ничего плохого в том, чтобы подкрепить свои знания немного бoльшим количеством теории и примеров.
Итак, без лишних слов… Давайте начнем!
map()
Функция «map()» принимает в качестве параметра другую функцию наряду с каким-либо массивом. Идея состоит в том, чтобы применить функцию (переданную в качестве аргумента) к каждому элементу в массиве.
Это пригодится по двум причинам:
- Вам не нужно писать цикл
- Это быстрее, чем цикл
Давайте посмотрим на это в действии. Я объявлю функцию «num_func()», которая принимает одно число в качестве параметра. Это число возводится в квадрат, делится на 2 и возвращается как таковое. Обратите внимание, что операции были выбраны произвольно, вы можете делать все что угодно внутри функции:
А теперь давайте объявим массив чисел, к которому мы хотим применить «num_func()». Обратите внимание, что «map()» сама вернет объект-отображение, поэтому вам необходимо преобразовать его в список:
Похоже, процесс успешно завершен. Здесь нет ничего революционного, но хорошо бы избегать циклы, когда это возможно.
filter()
Вот еще одна достойная функция, которая сэкономит ваше время — как при написании, так и при выполнении. Как следует из названия, идея состоит в том, чтобы хранить в массиве только те элементы, которые удовлетворяют определенному условию.
Как и в случае с «map()», мы можем заранее объявить функцию, а затем передать ее в «filter()» вместе с итерируемым объектом (например, списком).
Давайте посмотрим на это в действии. Я пошел дальше и объявил функцию «more_than_15 ()», которая, как следует из названия, вернет «true», если элемент, заданный в качестве параметра, больше 15:
Далее мы объявляем массив чисел и передаем их в качестве второго параметра в функцию «filter()»:
Как и ожидалось, только три значения удовлетворяют данному условию. Еще раз, ничего революционного здесь, но выглядит намного лучше, чем цикл.
reduce()
Теперь «reduce()». Она немного отличается от предыдущих двух. Для начала мы должны импортировать его из модуля functools. Основная идея заключается в том, что она будет применять данную функцию к массиву элементов и в результате будет возвращать одно значение.
Последняя часть имеет решающее значение — «reduce()» не возвращает массив элементов, он всегда возвращает одно значение. Давайте посмотрим на схему, чтобы конкретизировать эту концепцию:
Вот логика, написанная на случай, если диаграмма не ясна на 100%:
- 5 добавляется к 10, результаты в 15
- 15 добавляется к 12, результаты в 27
- 27 добавляется к 18, результат 45
- 45 добавляется к 25, результат 70
И 70 это значение, которое возвращается. Чтобы начать с реализации кода, давайте импортируем функцию уменьшения из модуля functools и объявим функцию, которая возвращает сумму двух чисел:
Теперь мы можем вернуться к диаграмме в коде и убедиться, что все работает как надо:
Пока не заходите в раздел комментариев — я прекрасно знаю, что есть другие способы суммировать элементы списка. Это самый простой пример, демонстрирующий работу функции.
Прежде, чем вы уйдете:
Я надеюсь, что вы можете как-то использовать эти три функции в вашей повседневной жизни. Повышение скорости может не быть значительным — зависит от объема данных, с которыми вы работаете, — но код будет выглядеть лучше с меньшим количеством циклов.
Если у вас есть другие примеры, не стесняйтесь поделиться ими в разделе комментариев.
Спасибо за прочтение.
Brenwen
Мне вместо map намного удобнее использовать list generator да и читается оно легче.
Griboks
Хочу заметить, что списковые выражения совмещают в себе и map, и filter, ещё и быстрее работают.
А ещё хочу сказать автору, что это 3 базовые функции для работы с последовательностями в любом языке. Не могу представить, как их можно не знать.
0xd34df00d
Базовая функция — это fold (ну или reduce в питоне). map и filter выражаются через нее.
Собственно, компиляторы ФП-языков делают оптимизации через приведение функций над списками к двум базовым (build и foldr).