Использование логических операторов в языке Python

Раздел: Основы Python -> Базовые операции

Логические операции в Python

Логические операции and, or и not позволяют комбинировать или инвертировать логические значения (True/False). Они широко применяются в условных конструкциях, циклах, а также для упрощения присваиваний и проверок.

Как проверить несколько условий одновременно?

Основной способ - использовать and для всех истинных условий и or для хотя бы одного истинного. Например, проверка, что число положительное и чётное:


x = 8
if x > 0 and x % 2 == 0:
    print('Число положительное и чётное')

логические операции в языке python (логические операции в python)

Число положительное и чётное

оператор вывода в языке python (оператор вывода в python)

Оператор not инвертирует значение. Пример проверки, что число не равно нулю:


y = 0
if not y:
    print('y равен нулю (или falsy)')
y равен нулю (или falsy)

Типичная ошибка: путать приоритет операций. not имеет самый высокий приоритет, затем and, потом or. Рекомендуется явно использовать скобки: if (a and b) or c:.

Как присвоить значение по умолчанию, если переменная равна None или False?

Используется or: выражение a = b or default вернёт default, если b ложно (False, None, 0, пустая строка и т.д.).


name = None
display = name or 'Гость'
print(display)
Гость

Ошибка: если допустимым значением является 0 или пустая строка, or заменит их на запасное. В таких случаях лучше использовать явную проверку if name is None.

Как проверить вхождение числа в диапазон?

Можно комбинировать операторы сравнения с and. Пример проверки, что возраст от 18 до 60 включительно:


age = 25
if age >= 18 and age <= 60:
    print('Взрослый трудоспособный возраст')
Взрослый трудоспособный возраст

В Python также допускается цепочка сравнений: if 18 <= age <= 60:, что более читаемо.

Распространённая проблема: забыть про приоритет - if age >= 18 and age <= 60 эквивалентно, но если опустить скобки в сложных условиях, результат может быть неожиданным.

Как отфильтровать элементы, удовлетворяющие условию?

С помощью and в списковом включении. Например, выбрать числа, которые делятся на 3 и больше 10:


nums = [3, 12, 9, 18, 5]
result = [n for n in nums if n % 3 == 0 and n > 10]
print(result)
[12, 18]

Ошибка: использование оператора & вместо and. & - побитовая операция для целых чисел, для логических значений она тоже работает, но имеет другой приоритет и может привести к путанице.

Как избежать ошибки при обращении к атрибуту, если объект может быть None?

Используется короткое замыкание с and. Если первое условие ложно, второе не вычисляется. Пример:


user = None
if user is not None and user.is_active:
    print('Пользователь активен')

Без and пришлось бы писать вложенный if.

Важно: порядок условий имеет значение. Если первым поставить user.is_active and user is not None, то возникнет ошибка AttributeError.

Расширенные примеры логических операций

Пример 1: Комбинированное условие с использованием скобок для управления приоритетом.

Пример

def access_allowed(role, is_admin, is_banned):
    # Доступ разрешён, если пользователь администратор или (роль "editor" и не забанен)
    if is_admin or (role == 'editor' and not is_banned):
        return True
    return False

print(access_allowed('viewer', False, False))
print(access_allowed('editor', False, True))
print(access_allowed('viewer', True, True))
False
False
True

Пояснение: скобки явно задают, что and вычисляется раньше or, даже несмотря на приоритет. Это улучшает читаемость и предотвращает ошибки.

Пример 2: Выбор первого ненулевого элемента из нескольких с помощью or.

Пример

a = 0
b = ''
c = None
d = 42
e = 100

first_valid = a or b or c or d or e
print(first_valid)
42

Пояснение: or возвращает первый истинный операнд. Если все ложные, возвращается последний.

Пример 3: Использование not для фильтрации списка.

Пример

nums = [0, 1, 0, 3, 0, 5]
non_zero = [n for n in nums if not n == 0]
print(non_zero)
[1, 3, 5]

Пояснение: not n == 0 эквивалентно n != 0. Такой приём полезен, когда нужно инвертировать сложное условие.

Пример 4: Короткое замыкание для предотвращения деления на ноль.

Пример

def safe_divide(a, b):
    return b != 0 and a / b or 'Деление на ноль'

print(safe_divide(10, 2))
print(safe_divide(10, 0))
5.0
Деление на ноль

Пояснение: если b != 0 ложно, and сразу возвращает False, и деление не выполняется. Если истинно, вычисляется a / b, и это значение передаётся в or.

Пример 5: Вложенные логические операции для проверки формы.

Пример

email = 'test@example.com'
password = '12345'
if email and '@' in email and (len(password) >= 8 or password.isdigit()):
    print('Данные прошли проверку')
else:
    print('Некорректные данные')
Некорректные данные

Пояснение: email - истинно (непустая строка), '@' in email - истинно, но len(password) >= 8 ложно (5 < 8) и password.isdigit() истинно, поэтому or даёт истину, и всё условие истинно. В данном примере пароль из цифр длиной 5, поэтому условие прошло бы. (Исправлен результат: выведется 'Данные прошли проверку').

Логические операции в Python - comments

En
логические операции в языке python (python)