Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python循环;“边做边做”;在树上_Python - Fatal编程技术网

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)