python tutorial - Python Functions Map, Filter, And Reduce - learn python - python programming
map, filter, and reduce
- Python provides several functions which enable a functional approach to programming. These functions are all convenience features in that they can be written in Python fairly easily. Functional programming is all about expressions. We may say that the Functional programming is an expression oriented programming. Expression oriented functions of Python provides are:
- map(aFunction, aSequence)
- filter(aFunction, aSequence)
- reduce(aFunction, aSequence)
- lambda
- list comprehension
map
- One of the common things we do with list and other sequences is applying an operation to each item and collect the result.
- For example, updating all the items in a list can be done easily with a for loop:
- Since this is such a common operation, actually, we have a built-in feature that does most of the work for us.
- The map(aFunction, aSequence) function applies a passed-in function to each item in an iterable object and returns a list containing all the function call results.
- We passed in a user-defined function applied to each item in the list. map calls sqr on each list item and collects all the return values into a new list.
- Because map expects a function to be passed in, it also happens to be one of the places where lambda routinely appears:
- In the short example above, the lambda function squares each item in the items list.
- As shown earlier, map is defined like this:
- While we still use lamda as a aFunction, we can have a list of functions as aSequence:
Output:
- Because using map is equivalent to for loops, with an extra code we can always write a general mapping utility:
- Since it's a built-in, map is always available and always works the same way.
- It also has some performance benefit because it is usually faster than a manually coded for loop.
- On top of those, map can be used in more advance way. For example, given multiple sequence arguments, it sends items taken form sequences in parallel as distinct arguments to the function:
- As in the example above, with multiple sequences, map() expects an N-argument function for N sequences.
- In the example, pow function takes two arguments on each call.
- Here is another example of map() doing element-wise addition with two lists:
- The map call is similar to the list comprehension expression. But map applies a function call to each item instead of an arbitrary expression.
- Because of this limitation, it is somewhat less general tool. In some cases, however, map may be faster to run than a list comprehension such as when mapping a built-in function. And map requires less coding.
- If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation).
- The iterable arguments may be a sequence or any iterable object; the result is always a list:
- For Python 3, we may want to use itertools.zip_longest instead:
- The zip_longest() makes an iterator that aggregates elements from the two iterables (m & n).
filter and reduce
- As the name suggests filter extracts each element in the sequence for which the function returns True.
- The reduce function is a little less obvious in its intent. This function reduces a list to a single value by combining elements via a supplied function.
- The map function is the simplest one among Python built-ins used for functional programming.
- These tools apply functions to sequences and other iterables. The filter filters out items based on a test function which is a filter and apply functions to pairs of item and running result which is reduce.
- Because they return iterables, range and filter both require list calls to display all their results in Python 3.0.
- As an example, the following filter call picks out items in a sequence that are less than zero:
- Items in the sequence or iterable for which the function returns a true, the result are added to the result list.
- Like map, this function is roughly equivalent to a for loop, but it is built-in and fast:
- Here is another use case for filter(): finding intersection of two lists:
- Note that we can do the same with list comprehension:
- The reduce is in the functools in Python 3.0.
- It is more complex. It accepts an iterator to process, but it's not an iterator itself. It returns a single result:
- At each step, reduce passes the current product or division, along with the next item from the list, to the passed-in lambda function.
- By default, the first item in the sequence initialized the starting value.
- Here's the for loop version of the first of these calls, with the multiplication hardcoded inside the loop:
- Let's make our own version of reduce.
- We can concatenate a list of strings to make a sentence. Using the Dijkstra's famous quote on bug:
- We can get the same result by using join :
- We can also use operator to produce the same result:
- The built-in reduce also allows an optional third argument placed before the items in the sequence to serve as a default result when the sequence is empty.