Условный Оператор python
Есть такой код:
while(True):
if new_node.value == temp.value:
return False
if temp.left is None:
temp.left = new_node
return True
temp = temp.left
else:
if temp.right is None:
temp.right = new_node
return True
temp = temp.right
Может кто объяснить эту часть: temp = temp.left и temp = temp.right в каком случае эта строчка сработает?
Ответы (2 шт):
- Блок
elseсработает после циклов в том случае, если только выполнение цикла не было прервано оператором break, return или raise. temp.left is None- проверяет у объектаtempатрибутleftнаNone, если он таким является, тогда срабатывает положительная ветка.
Не понял почему минусы у ответа - я всего лишь дал ответ на вопрос... Для тех кто поставил - вот вам пример:
i = 0
while i < 10:
i += 1
if i > 20:
print('Я сработал!')
break
else:
print('Увы - ничего не произошло =(')
Итог этой программы будет:
Увы - ничего не произошло =(
Но если поставить условие while i < 100:, то тогда итог работы будет:
Я сработал!
Вообще, код какой-то странный...
В нём else не имеет никакого смысла по двум причинам.
- В теле цикла нет ни одного
break. Соответственно, цикл может завершиться только естественным путём (т.е. по условию цикла), значит можно записать так:
while(True):
if new_node.value == temp.value:
return False
if temp.left is None:
temp.left = new_node
return True
temp = temp.left
if temp.right is None:
temp.right = new_node
return True
temp = temp.right
Но,
- Цикл бесконечный, и выход из него только по
return(с выходом из функции), значит код послеelseвообще никогда не выполнится. Итого имеем:
while(True):
if new_node.value == temp.value:
return False
if temp.left is None:
temp.left = new_node
return True
temp = temp.left
Судя по названиям переменных и структурам данных, это кусок функции, которая должна была добавлять новое значение в дерево. Цикл пытается идти по левым ветвям дерева и, если у очередного узла уже значение равное новому, то функция возвращает False (добавление не удалось). А если цикл дошёл до конца (очередная ссылка на левую ветвь равна None), то добавляет туда новый узел и возвращает True.
Проблема в том, что нет сравнения больше/меньше и по правой ветке дерева данный код никогда не идёт.
По идее, там должно быть что-то такое:
# temp = root_node
while(True):
if new_node.value == temp.value: # такое значение в дереве уже есть ?
return False
if new_node.value < temp.value: # новое значение меньше ? идём налево
if temp.left is None: # конец ветки ?
temp.left = new_node # добавляем новый узел слева
return True
temp = temp.left # иначе переходим к следующему узлу по левой ветке
else: # иначе идём направо
if temp.right is None: # конец ветки ?
temp.right = new_node # добавляем новый узел справа
return True
temp = temp.right # иначе переходим к следующему узлу по правой ветке