2016-01-01 5 views
2

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

+0

Да. Это коротко. –

ответ

3

Да, оба and и or являются так называемыми операторами короткого замыкания. Оценка выражения and завершается, как только значение является ложным, оценка выражения or заканчивается, как только значение является правдивым.

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

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

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 and hard_boole.

2

От Python Documentation:

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

Так до тех пор, как это xFalse, выражение будет оцениваться с False

0

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

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

интерпретатор Python сначала проверяет F() заявление и если е() ложна, она будет немедленно перейти на другое заявление.

3

Просто открыть REPL и попробовать:

>>> False and 1/0 
False 

>> True or 1/0 
True 

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

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

P.S. Это duplicate

Смежные вопросы