代码之家  ›  专栏  ›  技术社区  ›  Bharel

递归调用函数的返回值

  •  0
  • Bharel  · 技术社区  · 6 年前

    是否存在允许缩短此代码段的内置代码:

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

    我想用 itertools.accumulate 一起 filter lambda 但这会使它变得不可读和丑陋。

    我将此用于树遍历,但它与许多其他区域相关,可能有多种形式,如:

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

    我不完全确定“递归”是不是合适的术语,但它在某种程度上与我相似。

    1 回复  |  直到 6 年前
        1
  •  0
  •   kindall    6 年前

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

    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() 调用,我们为此传递一个函数。最大迭代次数和sentinel值也被参数化。假设你想要最后一个- 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)