В чем разница между 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 объединяет условие в виде логического ИЛИ:
FalseorTrue- будет равно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) # недостижимая строка кода