Python循环;“边做边做”;在树上
有没有一种更像蟒蛇的方法来把这个循环放在一起Python循环;“边做边做”;在树上,python,Python,有没有一种更像蟒蛇的方法来把这个循环放在一起 while True: children = tree.getChildren() if not children: break tree = children[0] 更新: 我认为这种语法可能就是我要使用的: while tree.getChildren(): tree = tree.getChildren()[0] 如果我知道您使用的是哪种类型的收集api,那么建议一些东西就更容易了。在一个好的
while True:
children = tree.getChildren()
if not children:
break
tree = children[0]
更新:
我认为这种语法可能就是我要使用的:
while tree.getChildren():
tree = tree.getChildren()[0]
如果我知道您使用的是哪种类型的收集api,那么建议一些东西就更容易了。在一个好的api中,您可能会执行以下操作
while tree.hasChildren():
children = tree.getChildren()
tree = children[0]
我认为你的密码很好。如果你真的想,你可以用try/除了:
while True:
try:
tree = tree.getChildren()[0]
except (IndexError, TypeError):
break
如果getChildren()
在没有子项时返回空列表,索引器将工作。如果它返回False
或0
或None
或其他一些不可订阅的类似False的值,TypeError
将处理异常
但这只是另一种方式。再说一次,我不认为Pythonistas会找到你已经拥有的代码。如果没有进一步的测试,我相信这应该是可行的:
try: while True: tree=tree.getChildren()[0]
except: pass
您可能还希望覆盖树类中的\uuu getitem\uuuuuuu()
(括号操作符),以便进一步整理
try: while True: tree=tree[0]
except: pass
(我的第一个答案建议直接使用iter(tree.getChildren,None)
,但这不起作用,因为我们不总是调用相同的tree.getChildren
函数。)
为了解决这个问题,我建议使用lambda的非绑定变量作为可能的解决方法。我认为在这一点上,该解决方案并不比之前发布的任何其他解决方案更好:
您可以使用它的第二个哨兵形式,使用lamda的奇怪绑定:
for children in iter((lambda : tree.getChildren()), None):
tree = children[0]
(这里假设getChildren()在没有子对象时返回None
,但必须用它返回的任何值([]
?)替换。)
iter(function,sentinel)
反复调用函数,直到它返回sentinel值。您真的只需要第一个分支吗?我想你不会,你想要整棵树。首先,我要这样做:
def allitems(tree):
for child in tree.getChildren():
yield child
for grandchild in allitems(child):
yield grandchild
这将贯穿整棵树。然后你可以:
for item in allitems(tree):
do_whatever_you_want(item)
Pythonic、simple、clean,而且因为它使用生成器,所以即使对于大树也不会占用太多内存。不要重复你自己…Pavel说的是不要重复“children=tree.getChildren()”,这就是为什么我首先问这个问题的原因…如果以后不使用tree变量,您可以在循环中合并这两行:children=children[0]。getChildren()当然他稍后会使用tree
变量-children
在循环结束时是无效的…gnud,这是一个很好的观点(api方面),但是hasChildren不在api中。。。不管怎么说,你让我想到了这一点,我把它归结为:while node.getChildren():node=node.getChildren()[0]只要getChildren()不是很贵,这似乎是一个很好的解决方案,这真的是你想要做的吗?它从根到第一片叶子只沿着一条路径走,不是吗?不是,它一直在走,就像原来的一样。@johannix:will-tree.getChildren()[0]在到达叶子时引发索引器?不是,因为它不会进入循环。循环条件会捕捉到…@johannix:我的意思是你的循环只会沿着从根到第一个“最左边”的叶子的路径,然后停止。如果您想在整个树上循环,那么您需要Python中的另一条语句catch
语句
for item in allitems(tree):
do_whatever_you_want(item)