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
。是的,这是另一种方法。