- en
- Language: ru
- Documentation version: latest
4. Map, Filter и Reduce¶
Это три функции, которые способствуют функциональному подходу к программированию. Мы обсудим их по очереди и разберем случаи их использования.
4.1. Карта¶
Map
применяет функцию ко всем элементам в списке input_list. Вот чертеж:
Блюпринт
map(function_to_apply, list_of_inputs)
Чаще всего мы хотим передать все элементы списка в функцию по одному, а затем собрать вывод. Например:
items = [1, 2, 3, 4, 5]
squared = []
for i in items:
squared.append(i**2)
Map
позволяет нам реализовать это гораздо более простым и приятным способом. Вот, пожалуйста:
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
Чаще всего мы используем ламбды с map
, поэтому я сделал то же самое. Вместо списка входов мы можем иметь даже список функций!
def multiply(x):
return (x*x)
def add(x):
return (x+x)
funcs = [multiply, add]
for i in range(5):
value = list(map(lambda x: x(i), funcs))
print(value)
# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
4.2. Фильтр¶
Как следует из названия, filter
создает список элементов, для которых функция возвращает true. Вот короткий и лаконичный пример:
number_list = range(-5, 5)
less_than_zero = list(filter(lambda x: x < 0, number_list))
print(less_than_zero)
# Output: [-5, -4, -3, -2, -1]
Фильтр напоминает цикл for, но является встроенной функцией и работает быстрее.
Примечание: Если map & filter не кажутся вам красивыми, то вы можете прочитать о ``list/dict/tuple``пониманиях.
4.3. Уменьшить¶
Reduce
- это действительно полезная функция для выполнения некоторых вычислений над списком и возврата результата. Она применяет скользящее вычисление к последовательным парам значений в списке. Например, если вы хотите вычислить произведение списка целых чисел.
Обычным способом выполнения этой задачи в python является использование базового цикла for:
product = 1
list = [1, 2, 3, 4]
for num in list:
product = product * num
# product = 24
Теперь давайте попробуем сделать это с помощью reduce:
from functools import reduce
product = reduce((lambda x, y: x * y), [1, 2, 3, 4])
# Output: 24