Writing higher-order mappings and filters
Python's two built-in higher-order functions, map()
and filter()
, generally handle almost everything we might want to throw at them. It's difficult to optimize them in a general way to achieve higher performance. We'll look at functions of Python 3.4, such as imap()
, ifilter()
, and ifilterfalse()
, in Chapter 8, The Itertools Module.
We have three, largely equivalent ways to express a mapping. Assume that we have some function, f(x)
, and some collection of objects, C
. We have three entirely equivalent ways to express a mapping; they are as follows:
- The
map()
function:
map(f, C)
- A generator expression:
(f(x) for x in C)
- A generator function with a
yield
statement:
def mymap(f, C): for x in C: yield f(x) mymap(f, C)
Similarly, we have three ways to apply a filter
function to a collection
, all of which are equivalent:
- The
filter()
function:
filter(f, C)
- A generator expression:
(x for x in C if f(x))
- A generator function with a
yield
statement...