Functions taking iterables: peaks, compress, and skipper
Your comments are good, but they should all be written as docstrings instead.

When working with iterators, itertools and generator expressions are your friend.  peaks() works with three iterators, so zip() is useful.

Since the function accepts an iterable, it seems fitting that it should be a generator rather than returning a list.

Python supports double-ended inequalities.

from itertools import tee

def peaks(iterable):
    """Generates values in the iterable that are greater than the value
    preceding and following them."""
    before, this, after = tee(iter(iterable), 3)
    next(this)
    next(after)
    next(after)
    for prev, curr, succ in zip(before, this, after):
        if prev &lt; curr &gt; succ:
            yield curr


If you wanted to keep the old interface, which returns a list, then a list comprehension would be a good way to write it.

def peaks(iterable):
    """Returns a list of values in the iterable that are greater than the
    preceding and following value."""
    xs, ys, zs = tee(iter(iterable), 3)
    next(ys)
    next(zs)
    next(zs)
    return [y for (x, y, z) in zip(xs, ys, zs) if x &lt; y &gt; z]




I find your compress() weird, in that it sorts the results.

You can implement the function using just a generator expression.

def compress(values, incl_excl):
    """Keeping only values whose corresponding entry in incl_excl is true,
    generates the sorted filtered list."""
    yield from sorted(val for val, include in zip(values, incl_excl) if include)




In skipper(), the two occurrences of yield next(itr) should be combined.

def skipper(iterable, n=0):
    """Generator that yields the first element, then skips n values between
    results, until the input is exhausted."""
    iterable = iter(iterable)
    while True:
        yield next(iterable)
        for _ in range(n):
            next(iterable)