9. Functional Programming

Functional programming is just a style of programming using functions to transform data. Theoretically, functional programming has deep roots in math and is very technical. However, the easiest way to understand functional programming is to understand three main functions.

  • map() transforms an item to a new one

  • filter() removes an item

  • reduce() collapses a collection of values into a single one

Note

Functional programming is said to be describing what we are doing. The opposite, imperative programming, is said to be describing how we are doing something. Functional programming may be viewed as declarative programming, and imperative programming may be viewed as procedural programming.

9.1. map

Here’s an example of using map() to transform data. Note that map() returns an iterator and so we have to convert it to a list to observe the outputs.

1numbers = [1, 2, 3, 4, 5]
2
3output = map(lambda x: x + 1, numbers)
4output = list(output)
5
6print(output)

9.1.1. Exercise

Map the following list of integers into a new one where each element is a boolean indicating if the corresponding original element was an even number.

1numbers = [1, 2, 3, 4, 5]

Solution.

1numbers = [1, 2, 3, 4, 5]
2
3output = map(lambda x: x % 2 == 0, numbers)
4output = list(output)
5
6print(output)

9.2. filter

Here’s an example of using filter() to remove items from a collection.

1numbers = [1, 2, 3, 4, 5]
2
3output = filter(lambda x: x % 2 == 0, numbers)
4output = list(output)
5
6print(output)

9.2.1. Exercise

Create a new list of names from the one below with names starting with ‘J’.

1names = ['Jack', 'John', 'Mary', 'Jane', 'Nancy']

Solution.

1names = ['Jack', 'John', 'Mary', 'Jane', 'Nancy']
2
3j_names = filter(lambda name: name.lower().startswith('j'), names)
4j_names = list(j_names)
5
6print(j_names)

9.3. reduce

The reduce() function is available through the functools module. Reduce takes the elements in a collection and collapses them into one final value. Below, we use reduce() to sum up all the integers in a list.

1from functools import reduce
2
3numbers = [1, 2, 3, 4, 5]
4
5output = reduce(lambda x, y: x + y, numbers)
6
7print(output)

9.3.1. Exercise

Reduce the following list of numbers to the product of all the numbers.

1numbers = [1, 2, 3, 4, 5]

Solution.

1from functools import reduce
2
3numbers = [1, 2, 3, 4, 5]
4
5output = reduce(lambda x, y: x * y, numbers)
6
7print(output)

9.3.2. Exercise

Get the sum of the ages for the males and females in the data below.

1data = [
2    ('John', 32, 'Male'), ('Jack', 28, 'Male'),
3    ('Jeremy', 33, 'Male'), ('Mary', 28, 'Female'),
4    ('Nancy', 27, 'Female'), ('Katherine', 33, 'Female')
5]

Solution.

 1from functools import reduce
 2
 3data = [
 4    ('John', 32, 'Male'), ('Jack', 28, 'Male'),
 5    ('Jeremy', 33, 'Male'), ('Mary', 28, 'Female'),
 6    ('Nancy', 27, 'Female'), ('Katherine', 33, 'Female')
 7]
 8
 9items = filter(lambda tup: tup[2] == 'Male', data)
10items = map(lambda: tup[1], items)
11male_total_age = reduce(lambda x, y: x + y, items)
12
13items = filter(lambda tup: tup[2] == 'Female', data)
14items = map(lambda: tup[1], items)
15female_total_age = reduce(lambda x, y: x + y, items)
16
17print(male_total_age)
18print(female_total_age)