Application of higher-order function in Python
Nice docstring.

Your loop is too complicated, and not idiomatic Python.  Use range(n) to repeat n times:

def repeated(f, n):
    """Docstring here"""
    def g(x):
        for _ in range(n):
            x = f(x)
        return x
    return g


Your repeated() function works fine for functions that accept a single argument, like square(x) (which could just be written x * x, by the way).  However, it fails for higher-arity functions, such as

def fib_iter(a, b):
    return b, a + b


To handle multi-argument functions…

def repeated(f, n):
    """Docstring here"""
    def g(*x):
        for _ in range(n):
            x = f(*x) if isinstance(x, tuple) else f(x)
        return x 
    return g


However, there is a bug in that: repeated(square, 0)(2) would return a tuple (2,) rather than an int 2.  To work around that special case…

def repeated(f, n):
    """Docstring here"""
    def g(*x):
        for _ in range(n):
            x = f(*x) if isinstance(x, tuple) else f(x)
        return x

    def unpack(*x):
        result = g(*x)
        if isinstance(result, tuple) and len(result) == 1:
            return result[0]
        else:
            return result

    return unpack