def irange(a, b=None, c=None):
    """
    same signature as range(). However, starts at "1" + its always inclusive of the last element.

    original documentation:
        range(stop) -> range object
        range(start, stop[, step]) -> range object

        Return an object that produces a sequence of integers from start (inclusive)
        to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
        start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
        These are exactly the valid indices for a list of 4 elements.
        When step is given, it specifies the increment (or decrement).
    """
    if c is None:
        c = 1
    if b is None:
        all = list(range(a))
        for i in all:
            yield i + 1
    else:
        if c > 0:
            all = list(range(a, b + 1, c))
        else:
            all = list(range(a, b - 1, c))
        for i in all:
            yield i
