Short-circuit: Python czasem leniwy
and i or nie zawsze oceniają oba operandy — i można wykorzystać tę właściwość do ochrony przed błędami.
Python czasem nie sprawdza całego stanu
U and oraz or jest ważna
Własność — short-circuit (zwarcie): Python oblicza sekundę
operand, tylko jeśli naprawdę jest to konieczne do odpowiedzi.
and: jeśli A już False
Jeśli A fałszywe, wszystko A and B już
musi być fałszywe, niezależnie od B. Python to rozumie i nie rozumie
poświęca czas na obliczanie B.
or: jeśli A już True
Podobnie: jeśli A prawdziwe, całe
A or B musi już być prawdą.
Prawdziwa korzyść: Ochrona przed błędami
To nie tylko optymalizacja szybkości — czasem to właśnie ona ratuje program przed awarią:
name = ""
if name and name[0] == "A":
print(„Nazwa zaczyna się na A”)
else:
print(„Warunek niespełniony”)
Jeśli name jest pustym łańcuch znaków, jest falsy sam w sobie (rozdział 8),
Zatem name and ... już jest fałszywe i Python nawet nie
próbuje obliczyć name[0]. Gdyby kolejność była odwrotna...
name = ""
print(name[0] == "A" and name)
# IndexError: string index out of range!
name and name[0] == "A" jest bezpieczne: najpierw sprawdza się, czy name wcale nie jest pusty. name[0] == "A" and name jest niebezpieczne: Python spróbuje to rozgryźć name[0] nawet przed jakimkolwiek sprawdzeniem pustki i otrzyma IndexError dla pustej linii (rozdział 8, sekcja o indeksach).Napisz warunek, który bezpiecznie sprawdza, czy niepusty łańcuch znaków text kończy się na znak '!' — tak, aby dla pustego łańcuch znaków nie pojawiał się IndexError.