Both range and generator objects are examples of iterable objects.
A range is defined by a stopping value, with an optional starting value and optional step size allowed. The result is an iterable of integers. A range also supports operations (like containment) that are not necessarily supported by other iterables.
A generator is defined by a generator expression or a generator function, either of which results in an iterable of arbitrary values.
The iterable aspect of a range object can be simulated by a generator:
def myrange(stop, start=None, step=None):
    if start is not None:
        from_ = stop
        to_ = start
    else:
        from_ = 0
        to_ = stop
    if step is None:
        step = 1 if from_ < to_ else -1
    while from_ < to_:
         yield from_
         from_ += step
Then
>>> list(myrange(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
As Python 2 reached end-of-life nearly a year ago, there's not much reason to go into range. Suffice it to say, in Python 2 range was a function that returned a list of integers, while xrange was a type whose value represents a list of integers. Python 3 did away with the function and reused the name for the type.