# map(), filter(), reduce()

### map() <a href="#map" id="map"></a>

`map` застосовує функцію до всіх елементів списку:

```python
map(function_to_apply, list_of_inputs)
```

Необхідно передати всі елементи списку в функцію один за одним і зібрати значення, що повертаються в новий список. Наприклад:

```python
items = [1, 2, 3, 4, 5]
squared = []
for i in items:
    squared.append(i**2)
```

`map` дозволяє виконати це завдання елегантним способом:

```python
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
```

:question:А це не є простішим аналогом map’у:

```python
squared = list((x**2 for x in items))
```

Найчастіше з `map` застосовують анонімні функції, як у прикладі вище. Замість списку вхідних даних також можна використовувати список функцій:

```python
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)

# Результат:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
```

### filter() <a href="#filter" id="filter"></a>

`filter` повертає список елементів, для яких задана функція повертає `True`:

```python
number_list = range(-5, 5)
less_than_zero = list(filter(lambda x: x < 0, number_list))
print(less_than_zero)

# Результат: [-5, -4, -3, -2, -1]
```

`filer` є вбудованою функцією і працює швидше, ніж цикл.

### reduce() <a href="#reduce" id="reduce"></a>

`reduce` дуже корисна функція для виконання обчислень на списку та повернення єдиного результату. Вона згортає список, застосовуючи отриману як аргумент функцію по черзі до послідовних пар елементів. Наприклад, якщо ми хочемо порахувати добуток всіх елементів списку чисел.

Звичайним вирішенням цього завдання буде використання циклу `for`:

```python
product = 1
list = [1, 2, 3, 4]
for num in list:
    product = product * num

# product = 24
```

`reduce`:

```python
from functools import reduce
product = reduce((lambda x, y: x * y), [1, 2, 3, 4])

# product = 24
```
