递归调用函数的返回值

时间:2018-06-25 19:55:36

标签: python python-3.x recursion

是否有内置功能可以缩短此代码段:

for i in range(5):
    obj = obj.getobj()
    if obj is None:
        break
print(i)

我曾想过将itertools.accumulatefilterlambda一起使用,但这使它变得不可读和丑陋。

我正在使用它进行树遍历,但它与其他许多区域相关,并且可能以多种形式出现,例如:

for i in range(5):
    func = func()

P.S。我不确定“递归”是否合适,但在某种程度上对我来说很像。

1 个答案:

答案 0 :(得分:0)

您可以很容易地为此编写一个辅助函数:

def traverse(func, obj, max=5, sentinel=None):
    last = obj
    for i in range(max):
        obj = func(obj)
        if obj is sentinel:
            break
        last = obj
    return last

我们没有为此硬编码obj = obj.getobj()调用,而是为此传递了一个函数。最大迭代次数和前哨值也已参数化。假设您可能想要最后一个非None值,则此函数还会跟踪该值并返回它。

用法:

traverse(lambda o: o.getobj(), obj)   

# slightly faster, uses class's method directly
# but all objects in the chain must be same type
traverse(type(obj).getobj, obj)