Оба этих кода дают одинаковые результаты
Это неверно.Это верно только в том случае, если входные данные имеют определенные типы.Рассмотрим этот тривиальный контрпример:
def parrot_trouble1(talking, hour):
if talking:
if hour < 7 or hour > 20:
return True
return False
def parrot_trouble2(talking, hour):
return (talking and (hour < 7 or hour > 20))
parrot_trouble1([], 0) # False
parrot_trouble2([], 0) # []
Обратите внимание, что ни and
nor or
ограничивает значение и тип, который они возвращают, False
и True
, но скорее возвращает последний оцененный аргумент.
parrot_trouble2
имеет короткое замыкание.Давайте предположим, что talking
является логическим входом.Если talking
равно False
, выражение замкнется и вернется False
.Если talking
равно True
, parrot_trouble2
вернет True
или False
в зависимости от значения hour
.
parrot_trouble1
не закорачивает, но результаттот же самый.Если talking
является логическим значением и False
, функция возвращает False
.Если talking
равно True
, то проверяется второй критерий hour < 7 or hour > 20
.Если условие не указано, то, поскольку ничего не возвращается, Python перемещается наружу и после оператора if
в return False
.