Условный Оператор 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 шт):

Автор решения: Алексей Белкин
  1. Блок else сработает после циклов в том случае, если только выполнение цикла не было прервано оператором break, return или raise.
  2. temp.left is None - проверяет у объекта temp атрибут left на None, если он таким является, тогда срабатывает положительная ветка.

Не понял почему минусы у ответа - я всего лишь дал ответ на вопрос... Для тех кто поставил - вот вам пример:

i = 0
while i < 10:
    i += 1
    if i > 20:
        print('Я сработал!')
        break
else:
    print('Увы - ничего не произошло =(')

Итог этой программы будет:

Увы - ничего не произошло =(

Но если поставить условие while i < 100:, то тогда итог работы будет:

Я сработал!
→ Ссылка
Автор решения: GrAnd

Вообще, код какой-то странный...
В нём else не имеет никакого смысла по двум причинам.

  1. В теле цикла нет ни одного 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

Но,

  1. Цикл бесконечный, и выход из него только по 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            # иначе переходим к следующему узлу по правой ветке
→ Ссылка