В чем разница между return f(n+1) return f(n+2) и return f(n+1) or f(n+2)

Пример кода:

def f(x, y, p):
    if x + y >= 142 and p == 3:
        return True
    elif x + y != 142 and p == 3:
        return False
    return f(x + 2, y, p + 1) or f(x * 2, y, p + 1) or f(x, y + 2, p + 1) or f(x, y * 2, p + 1)

for i in range(1, 100):
    if f(2, i, 1):
        print(i)
        break

Вывод:

35

Другой код:

def f(x, y, p):
    if x + y >= 142 and p == 3:
        return True
    elif x + y != 142 and p == 3:
        return False
    return f(x + 2, y, p + 1) 
    return f(x * 2, y, p + 1)
    return f(x, y + 2, p + 1)
    return f(x, y * 2, p + 1)

for i in range(1, 100):
    if f(2, i, 1):
        print(i)
        break

Вывода нет.

В чем разница между этими кодами и почему разное поведение?


Ответы (1 шт):

Автор решения: Komdosh

Оператор or объединяет условие в виде логического ИЛИ:

False or True - будет равно True

Причём имеется ряд оптимизаций, если хотя бы одно из условий or равняется True, то далее не имеет смысла выполнять код

return f1() or f2() or f3() or f4() - если f1() вернул False, то далее мы выполним f2(), если f2() вернёт True, то f3() и f4() не будут исполнены, т.к. мы уже определили, что полное условие выдаст True

Когда вы пишите несколько return подряд, то выполнится только первый и сразу же выйдет из функции, соответственно следующие строки становятся недостижимы.

def f(x, y, p):
  if x + y >= 142 and p == 3:
      return True
  elif x + y != 142 and p == 3:
      return False
  return f(x + 2, y, p + 1) # выход из функции
  return f(x * 2, y, p + 1) # недостижимая строка кода
  return f(x, y + 2, p + 1) # недостижимая строка кода
  return f(x, y * 2, p + 1) # недостижимая строка кода
→ Ссылка