def my_func(my_list):
    run = True
    while run:
        for i, thing in enumerate(my_list):
            my_val = another_func(thing)
            if i == 0:
                # do some stuff
            else:
                if my_val == something:
                    my_list = my_list[:-1]
                    break
                # do some other stuff    
This is an iterative method.
Decorator
class TailCall(object):
    def __init__(self, __function__):
        self.__function__ = __function__
        self.args = None
        self.kwargs = None
        self.has_params = False
    def __call__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs
        self.has_params = True
        return self
    def __handle__(self):
        if not self.has_params:
            raise TypeError
        if type(self.__function__) is TailCaller:
            return self.__function__.call(*self.args, **self.kwargs)
        return self.__function__(*self.args, **self.kwargs)
class TailCaller(object):
    def __init__(self, call):
        self.call = call
    def __call__(self, *args, **kwargs):
        ret = self.call(*args, **kwargs)
        while type(ret) is TailCall:
            ret = ret.__handle__()
        return ret
@TailCaller
def factorial(n, prev=1):
    if n < 2:
        return prev
    return TailCall(factorial)(n-1, n * prev)
To use this decorator simply wrap your function with @TailCaller decorator and return TailCall instance initialized with required params.
I'd like to say thank you for inspiration to @o2genum and to Kyle Miller who wrote an excellent article about this problem.
Despite how good is to remove this limitation, probably, you have to be
aware of why this feature is not officially supported.