Python 递归调用函数';s返回值

Python 递归调用函数';s返回值,python,python-3.x,recursion,Python,Python 3.x,Recursion,是否有允许缩短此代码段的内置代码: 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() 另外,我不完全确定“递归”是否是合适的

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

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()

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

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

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) 

我不认为这个片段需要缩短?看起来很清楚!您可以将其放入名为recurse\u calls的函数中并使用它!这是非常清楚的,目前这是一个很好的解决方案,但我只是想知道是否有任何内置的做到这一点。就像你可以使用
yield
:-)在
itertools
中创建一切一样@MoxieBall只是为了证明我在使用变量
I
ofc。@MoxieBall
对于范围(5)
中的I定义
I
在该范围内,欢迎你打开解释器并检查:-)蹦床,我很欣赏这个答案的有用性,但它似乎回答了“如何缩短代码”的问题,“通过延长代码并将其放在其他地方”@MoxieBall我明白你的意思,但通常的做法是识别模式并编写代码来处理它。如果该模式被多次使用,那么代码的总量就会缩短。另外,一旦你摸索了这个函数,模式的每次使用都会更加清晰。顺便说一句,
操作符。methodcaller(“getobj”)
是你要寻找的,而不是
lambda
。是的,这是另一种方法。