Python—对方法和while循环非常困惑
我有这个方法:Python—对方法和while循环非常困惑,python,while-loop,Python,While Loop,我有这个方法: def is_active(self): if self.is_current_node(): return True cur_children = self.get_children() while cur_children is not None: for child in cur_children: if child.is_current_node(): retu
def is_active(self):
if self.is_current_node():
return True
cur_children = self.get_children()
while cur_children is not None:
for child in cur_children:
if child.is_current_node():
return True
raise Exception(child.display_name)
cur_children = cur_children.get_children()
return False
我将这个方法放在一起,并将引发异常(child.display\u name)
放在一起测试并“alert()”告诉我哪个孩子被击中了。这一例外从未提出过。您可能认为这是因为函数在if child.is\u current\u node()部分上返回了True
。好吧,如果我用这个替换if
部分:
for child in cur_children:
if child.is_current_node():
raise Exception(child.display_name)
它仍然不会引发异常。但是,如果我这样做:
for child in cur_children:
raise Exception(child.display_name)
提出了例外情况。我很困惑。我相信这是很荒谬的,但我一直到2岁,我不能用头脑来思考这个问题。也许是“当前”节点总是返回True,而“当前”选项卡总是返回False?我认为需要更多的背景来给你一个答案
我唯一能想到的是,当前节点会改变状态。一些想法:
cur_children=self.\u children
虽然cur_children不是无:
对于cur_儿童中的儿童:
如果子节点是当前节点():
返回真值
引发异常(子项显示\u名称)
cur_children=cur_children.\u children
我假设self.\u children
包含多个子元素:[A,B,C]
然后,在第一个循环中,需要A
。让我们假设A
有以下子项:[AA,AB,AC
]
现在,您可以这样做:cur\u children=cur\u children.\u children
。这意味着,现在不再从初始[A,B,C]
继续执行B
,而是继续执行AA
,依此类推
在本例中,它永远不会到达B
。这是有意的吗
您的当前节点()包含什么内容?可能您忘记了返回值,因此结果总是None
,并且bool(None)==False
另一个想法:(递归)
如果list.中的第一个子项是\u current\u node(),则在第一个代码段中永远不会引发异常
所有证据都支持self.is\u current\u node()始终为真,或者第一个扫描的子项.is\u current\u node()始终为真。给出第三个代码段,后者似乎就是这样
编辑:消除误解(孩子!=自己):/
事实上,我不得不问,这能做什么?它看起来有点像递归树遍历,但不太像。(cur_children=cur_children.get_children()行尤其有点奇怪)在是当前的\u节点
方法中有什么?它只是根据self检查一个静态值。\u url
并以布尔值的形式返回比较结果。@Eric-异常不应该总是在前两个版本中的一个中出现吗?第二个命令说,如果为True:raise
并且不从函数返回。第一个选项是raise
,如果中没有一个选项为True:
从函数返回。@aaronastering-如果是这样,为什么第一个版本不总是引发异常?第一个基本上是这样的,“For each:if True:return;raise;”oops,请参见我的编辑。我在编辑时更改了名称。抱歉,它们都是相同的函数。谢谢,但是在您的示例中,children
在哪里定义或传递到函数中?您的意思是:返回检查\u children(self.children)
,还是我遗漏了什么?由于某种原因,树遍历对我来说太混乱了。
def is_active(self):
def check_children(children):
for child in children:
if child.is_current_node():
return True
else:
if children._children:
return check_children(children._children)
return False
if self.is_current_node():
return True
return check_children(children)