是否有内置功能可以缩短此代码段:
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()
P.S。我不确定“递归”是否合适,但在某种程度上对我来说很像。
答案 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)