def compose(*fns):
    """Return the function composed with the given functions

    :param fns: functions
    :returns: a function

    >>> add2 = lambda x: x+2
    >>> mult3 = lambda x: x*3
    >>> new_fn = compose(add2, mult3)
    >>> new_fn(2)
    8

    .. note:: compose(fn1, fn2, fn3) is the same as fn1(fn2(fn3))
       which means that the last function provided is the first to be applied.

    """
    def compose2(f, g):
        return lambda x: f(g(x))
    return reduce(compose2, fns)
Return the function composed with the given functions

    :param fns: functions
    :returns: a function

    >>> add2 = lambda x: x+2
    >>> mult3 = lambda x: x*3
    >>> new_fn = compose(add2, mult3)
    >>> new_fn(2)
    8

    .. note:: compose(fn1, fn2, fn3) is the same as fn1(fn2(fn3))
       which means that the last function provided is the first to be applied.