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
这是一种迭代方法。
装饰
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)
要使用这个装饰简单地用@TailCaller
装饰包裹你的函数,并返回TailCall
实例与所需的PARAMS初始化。
我想说谢谢你的灵感@ o2genum和凯尔·米勒谁写an excellent article about this problem。
尽管删除此限制有多么好,但您可能需要知道why this feature is not officially supported的 。
,如果我们知道这些功能实际上做 –
你必须提供所有的'return'点,以递归转换为迭代这将是有益的。 – outoftime
再次检查我的答案。 – outoftime