Одного условия часто не хватает. Чтобы пустить человека на сайт, нужно проверить сразу и логин, и пароль. Чтобы разрешить полёт на самолёте, охрана проверяет и паспорт, и билет. Писать для этого вложенные if внутри if можно, но с ростом числа условий код быстро превращается в лестницу из отступов, в которой легко заблудиться.
В Python есть три слова, которые решают эту задачу без единой лишней ступеньки: and, or и not. Они соединяют несколько условий в одно или переворачивают готовый результат на противоположный. Освоив их, вы сможете записывать сложную проверку в одну строку — и, что важнее, читать чужой код с такими проверками.
and, or и not берут одно или два значения True/False и превращают их в новое значение True/False — точно так же, как обычные операторы + или * берут числа и превращают их в новое число.and: оба условия должны быть верны
Простыми словами: представьте пропускной пункт, где охранник требует одновременно и паспорт, и билет. Не хватает хоть одной бумаги — пропуска нет. Пускает только тогда, когда верны оба требования сразу.
Официально это называется логическим оператором and (от английского «и»). Он стоит между двумя условиями и даёт True, только если оба условия дали True. Если хотя бы одно из них — False, результат всего выражения тоже False.
has_passport = True
has_ticket = True
can_board = has_passport and has_ticket
print(can_board)
Разбираем построчно:
has_passport = True и has_ticket = True — две переменные с булевыми значениями, обычное присваивание, которое вы уже умеете делать.has_passport and has_ticket — слово and ставится между двумя выражениями, которые дают True/False. Python проверяет оба и решает: оба True — значит всё выражение True.can_board = ... — результат and (само значение True или False) кладётся в переменную, как в любое присваивание.print(can_board) — выведет True, потому что обе переменные до этого были True.and можно использовать и прямо в условии if, без промежуточной переменной — так делают чаще всего:
age = 25
has_license = True
if age >= 18 and has_license:
print("Можно за руль")
else:
print("Нельзя за руль")
Здесь age >= 18 и has_license — два отдельных условия, каждое даёт своё True/False, а and объединяет их в одно. При age = 25 и has_license = True оба условия истинны, поэтому весь блок if выполнится, и программа выведет Можно за руль.
or: достаточно хотя бы одного
Простыми словами: теперь другой пропускной пункт, где хватит любого из двух документов — паспорта или водительских прав. Не важно, каких именно, главное, чтобы хоть что-то одно было в наличии.
Официально это логический оператор or (от английского «или»). Он тоже стоит между двумя условиями, но даёт True, если истинно хотя бы одно из них. False получится только тогда, когда оба условия ложны — это единственный случай неудачи.
has_passport = False
has_license = True
if has_passport or has_license:
print("Документ есть")
else:
print("Ни одного документа")
has_passport or has_license — Python проверяет оба значения и ищет хотя бы одно True.has_passport равно False, зато has_license равно True. Одного истинного значения достаточно, поэтому весь or даёт True.if оказалось истинным, поэтому выполнится именно он, и программа выведет Документ есть.Разница между and и or легко путается в начале. Помогает такое правило: and — более строгий, требует всего сразу; or — более мягкий, соглашается хотя бы на одно из двух.
not: переворачиваем значение наоборот
Простыми словами: у выключателя света два положения, и not всегда щёлкает в противоположное тому, что было. Было включено — станет выключено, и наоборот. Он не сравнивает два значения, как and и or, а меняет на обратное только одно.
Официально это логический оператор not (от английского «не»). Он ставится перед одним условием и превращает True в False, а False — в True.
is_banned = False
if not is_banned:
print("Доступ разрешён")
is_banned = False — пользователь не заблокирован.not is_banned — ставим not прямо перед переменной. Python берёт её значение False и переворачивает: получаем True.if стало истинным, поэтому выполнится print, и программа выведет Доступ разрешён.not часто помогает избавиться от неудобного сравнения. Вместо if is_banned == False: опытные разработчики пишут короче — if not is_banned:. Смысл тот же, а читается как обычная фраза: «если не заблокирован».
Что считается первым: приоритет операторов
Простыми словами: когда в одной строке встречаются сразу and, or и not, нужно понимать, в каком порядке Python их считает — так же, как в математике умножение выполняется раньше сложения, даже если сложение написано первым по тексту.
Официально порядок вычисления называется приоритетом операторов. У логических операторов он такой: сначала not, затем and, и только потом or. Чтобы не держать это в голове и не ошибаться, в сомнительных случаях лучше расставлять круглые скобки — они всегда выполняются первыми и делают порядок наглядным.
age = 16
has_parent = True
result = age >= 18 or has_parent and age >= 14
print(result)
age >= 18 при age = 16 даёт False, а age >= 14 даёт True.and, потому что у него приоритет выше, чем у or: has_parent and age >= 14 превращается в True and True, то есть True. Это как если бы стояли скобки: age >= 18 or (has_parent and age >= 14).or: False or True даёт True. Программа выведет True.and и or выглядит запутанно — не надейтесь на память о приоритете, а сразу добавьте скобки вокруг той части, которая логически должна считаться первой. Код от этого станет и правильнее, и понятнее при повторном чтении.Собираем сложное условие целиком
Простыми словами: на практике редко нужен всего один оператор — обычно условие складывается из нескольких сравнений и нескольких логических связок сразу, как проверка на регистрации: пароль не короче 8 символов и содержит цифру, либо пользователь уже подтверждён администратором.
Официально это называют составным условием — несколько простых условий (сравнений), соединённых операторами and, or, not. Результат всё равно один — либо True, либо False — поэтому такое условие можно использовать в if точно так же, как и одиночное сравнение.
score = 78
attempts = 2
if score >= 60 and attempts <= 3:
print("Экзамен сдан")
else:
print("Экзамен не сдан")
score >= 60 при score = 78 даёт True — баллов хватает.attempts <= 3 при attempts = 2 тоже True — попыток не превышено.and соединяет два True в один True, условие if истинно, программа выводит Экзамен сдан.Такие же связки помнят и про двойное сравнение вроде 10 <= num <= 50, которое вы разбирали раньше: это тоже одно готовое условие, дающее True/False, и его можно объединять с другими через and, or, not так же, как обычное сравнение.
Частые ошибки
Путаница and и or
age = 15
if age >= 18 and age < 14:
print("Подросток")
and, только если оба требования действительно можно выполнить вместе. Здесь по смыслу нужен or, а границы сравнения нужно поменять местами.Английские && и || вместо and, or
if age >= 18 && has_ticket:
print("Проходите")
&& и || используются в других языках программирования, но не в Python. Здесь всегда нужны слова and и or.not применяется не к тому, к чему нужно
age = 20
if not age >= 18:
print("Совершеннолетний")
not age >= 18 переворачивает весь результат сравнения — это означает «младше 18», а не «совершеннолетний». При age = 20 условие окажется False, и сообщение вообще не выведется. Если нужно проверить именно совершеннолетие, not здесь просто лишний: достаточно age >= 18.Что важно запомнить
and даёт True, только если оба условия истинны.or даёт True, если истинно хотя бы одно из условий.not переворачивает одно значение на противоположное: True становится False и наоборот.not, потом and, потом or. В сомнительных случаях расставляйте скобки вручную.and, or, not, а не символами &&, ||, ! из других языков.True/False, поэтому его можно использовать в if точно так же, как обычное сравнение.Проверьте себя
4 вопроса
Логические операторы
Даны переменные:
has_passport = True
has_money = False
is_banned = False
Создайте булевы переменные:
can_enter—has_passport and has_moneycan_pay—has_passport or has_moneyis_allowed—not is_banned
Выведите их через пробел одним print.
Проверка диапазона
Дана переменная num = 25. Используя логические операторы, создайте переменные:
in_range—True, еслиnumне меньше 10 и не больше 50out_of_range—not in_range
Выведите их через пробел одним print.
Високосный год
Дана переменная year с номером года, например year = 2024.
Год является високосным, если он делится на 4, но НЕ делится на 100 — либо делится на 400.
Создайте переменную is_leap со значением True, если год високосный, и False в противном случае. Выведите её через print.
Пример: для year = 2024 должно получиться True, для year = 1900 — False, для year = 2000 — True.
Существует ли треугольник
Даны длины трёх отрезков: a, b, c, например a = 3, b = 4, c = 5.
Из трёх отрезков можно собрать треугольник тогда и только тогда, когда сумма любых двух сторон больше третьей — сразу для всех трёх пар.
Создайте переменную can_build со значением True, если треугольник собрать можно, и False в противном случае. Выведите её через print.
Пример: для a = 3, b = 4, c = 5 должно получиться True, для a = 1, b = 1, c = 5 — False.