Использование логических операторов в языке 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, поэтому условие прошло бы. (Исправлен результат: выведется 'Данные прошли проверку').