У меня есть скрипт Python, который я запускаю, который проверяет сочетание двух условий, одно из которых легко проверить, а другое сложно. Скажем, я пишу это как easy_boole и hard_boole в Python. Всегда ли интерпретатор сначала проверяет easy_boole, а затем возвращает False, если easy_boole == False? Оптимизирован ли интерпретатор в целом для максимально быстрого разрешения подобных запросов?

dsaxton

Ответов: 4

Ответы (4)

Да, и , и, и или являются так называемыми операторами короткого замыкания. Вычисление выражений и заканчивается, как только значение оказывается ложным, вычисление выражения или заканчивается, как только значение оказывается истинным.

Вы можете найти соответствующую документацию здесь.

Вот фрагмент кода, с помощью которого вы можете сами наблюдать за этим поведением:

def fib(n):
    if n <= 2:
        return 1
    return fib(n-1) + fib(n-2)

print(False and fib(100)) # prints False immediately
print(True and fib(100)) # takes very, very long
print(fib(100) and False) # takes very, very long

Помня об этом, всегда используйте easy_boole и hard_boole.

Да, python лениво оценивает операторы if. Например, в следующем коде:

if f() and g():
    print("GOOD")
else:
    print("BAD")

Интерпретатор Python сначала проверит оператор f (), и если f () имеет значение False, он немедленно перейдет к оператору else.

Просто откройте REPL и попробуйте:

>>> False and 1 / 0
False

>> True or 1 / 0
True

>>> False or 1 / 0
Traceback (most recent call last):
  File "", line 1, in 
ZeroDivisionError: division by zero

Это означает, что Python действительно лениво вычисляет логические операторы.

П.С. Это дубликат

Из Документация Python:

Выражение x и y сначала вычисляет x; если x ложно, его значение вернулся; в противном случае y вычисляется и результирующее значение возвращено.

Если x равно False, выражение будет оцениваться как False

2022 WebDevInsider