Логические операторы: and, or, not

Логические операторы: and, or, not

В предыдущих уроках вы научились сравнивать значения и получать True или False. Но реальные условия часто сложнее: «пользователь вошёл в систему и является администратором», «возраст меньше 18 или больше 65», «флаг не установлен». Для таких составных условий в Python используются три логических оператора: and, or, not.

Оператор and

and возвращает True, только если оба операнда истинны. Если хотя бы один False — результат False:

print(True and True)    # True
print(True and False)   # False
print(False and True)   # False
print(False and False)  # False

Практический пример — проверка диапазона:

age = 25
has_passport = True

can_travel = age >= 18 and has_passport
print(can_travel)   # True — оба условия выполнены

Оператор or

or возвращает True, если хотя бы один операнд истинен. Только если оба False — результат False:

print(True or True)    # True
print(True or False)   # True
print(False or True)   # True
print(False or False)  # False

Пример — альтернативные способы оплаты:

has_cash = False
has_card = True

can_pay = has_cash or has_card
print(can_pay)   # True — хотя бы один способ есть

Оператор not

not инвертирует булево значение: TrueFalse, FalseTrue:

print(not True)    # False
print(not False)   # True

is_banned = False
print(not is_banned)   # True — пользователь не забанен

Приоритет логических операторов

Порядок применения: not имеет наивысший приоритет, затем and, затем or. Это аналог приоритета умножения над сложением в арифметике.

# not применяется первым
print(not True or False)   # False: (not True) or False → False or False
print(not (True or False)) # False: not (True) → False

# and применяется перед or
print(True or False and False)  # True: True or (False and False) → True or False
print((True or False) and False) # False: True and False

Когда выражение сложное — всегда расставляйте скобки явно. Это делает код понятнее:

is_adult = age >= 18
is_member = True
is_blocked = False

# С явными скобками хорошо читается:
has_access = (is_adult and is_member) and not is_blocked

Ленивые вычисления (short-circuit evaluation)

Python не вычисляет правую часть выражения, если результат уже известен из левой. Это называется ленивыми (или короткими) вычислениями.

  • Для and: если левый операнд False — правый не вычисляется (и так уже False).
  • Для or: если левый операнд True — правый не вычисляется (и так уже True).
x = 0
# Без short-circuit: 10 / x вызвало бы ZeroDivisionError
# С short-circuit: левый операнд (x != 0) == False → правый не вычисляется
result = x != 0 and 10 / x > 2
print(result)  # False — деления не было

Это полезно для защиты от ошибок: сначала проверяем «можно ли выполнить операцию», и только если да — выполняем.

Логические операторы с не-булевыми значениями

Интересная особенность Python: and и or работают не только с bool, а с любыми значениями. Они возвращают один из операндов, а не просто True/False.

Правило:

  • a and b: если a — ложное значение, возвращает a; иначе возвращает b.
  • a or b: если a — истинное значение, возвращает a; иначе возвращает b.
print(0 and "hello")     # 0    (0 — ложное, вернули его)
print(5 and "hello")     # 'hello' (5 — истинное, вернули b)
print("" or "default")   # 'default' (пустая строка — ложная)
print("name" or "default") # 'name' (непустая строка — истинная)

Это позволяет писать удобные «значения по умолчанию»:

username = ""
display_name = username or "Гость"
print(display_name)   # Гость — потому что username пустая строка (ложная)

username = "Алиса"
display_name = username or "Гость"
print(display_name)   # Алиса

Комбинирование с операторами сравнения

Чаще всего логические операторы используются вместе с операторами сравнения:

age = 22
score = 85

# Сложное условие с and:
is_eligible = age >= 18 and age <= 35 and score >= 80
print(is_eligible)   # True

# То же через цепочку сравнений:
is_eligible2 = 18 <= age <= 35 and score >= 80
print(is_eligible2)  # True

# Условие с or:
day = "суббота"
is_weekend = day == "суббота" or day == "воскресенье"
print(is_weekend)    # True

Таблица истинности в одном месте

# and: True только если оба True
print(f"T and T = {True and True}")    # True
print(f"T and F = {True and False}")   # False
print(f"F and T = {False and True}")   # False
print(f"F and F = {False and False}")  # False

# or: False только если оба False
print(f"T or F = {True or False}")     # True
print(f"F or F = {False or False}")    # False

Проверь себя

Что выведет следующий код?

x = 10
print(x > 5 and x < 20)
print(x < 5 or x > 8)
print(not x == 10)
  • x > 5 and x < 20True and TrueTrue
  • x < 5 or x > 8False or TrueTrue
  • not x == 10not TrueFalse

Итог

  • and возвращает True только при оба-истина; иначе False.
  • or возвращает True при хотя-бы-один-истина; False только при оба-ложь.
  • not инвертирует: TrueFalse и наоборот.
  • Приоритет: not > and > or; при сомнениях — ставьте скобки.
  • Короткие вычисления: Python не вычисляет правый операнд, если результат уже определён левым.
  • and и or возвращают один из операндов (не обязательно bool); это позволяет задавать значения по умолчанию через x or default.

В следующем уроке разберём сокращённые формы операторов присваивания: +=, -=, *= и другие.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике