Каждый сайт, которым вы пользуетесь, постоянно что-то решает: пускать вас дальше или нет, показывать скидку или нет, принимать пароль или отклонять. За любым таким решением стоит один и тот же приём: программа задаёт себе вопрос и получает один из двух ответов — да или нет. В этом уроке разберёмся, как Python называет такие ответы и как самим задавать ему вопросы — сравнивая числа, строки и переменные между собой.
Всего два ответа: True и False
Представьте помощника, который никогда не отвечает «может быть» или «как посмотреть». На любой вопрос он говорит либо «да», либо «нет» — и третьего варианта не существует. Python ведёт себя точно так же: когда его о чём-то спрашивают, он всегда возвращает один из двух ответов, без полутонов.
У этих двух ответов в Python есть официальные имена — True (истина) и False (ложь). Это не текст в кавычках и не обычные слова, а ключевые слова языка: пишутся строго с заглавной буквы, без кавычек, и зарезервированы Python специально для этого. Тип данных, которому принадлежат такие значения, называется bool (булев тип) — такой же полноценный тип, как знакомые вам int (числа) и str (строки).
is_logged_in = True
is_premium = False
print(is_logged_in) # True
print(type(is_logged_in)) # <class 'bool'>
Разбор по строкам
is_logged_in = True— обычное присваивание: переменнойis_logged_inсохраняется значениеTrue, одно из двух возможных значений типа bool.is_premium = False— то же самое, но значениеFalse.print(is_logged_in)— печатает содержимое переменной; на экране появится словоTrue.print(type(is_logged_in))— знакомая по прошлым урокам функцияtype()показывает тип значения и выводит<class 'bool'>, подтверждая, что это именно булево значение.
Операторы сравнения — как задать вопрос
Значения True и False редко пишут руками. Гораздо чаще их получают, задавая Python вопрос: это число больше того? эти строки одинаковые? Такой вопрос записывается с помощью специальных знаков — операторов сравнения. Python вычисляет ответ сам и всегда возвращает True или False.
==Равно. Спрашивает, одинаковые ли значения. Два знака равенства — не путайте с присваиванием.!=Не равно. Истина, если значения различаются.>Больше. Истина, если левое значение строго больше правого.<Меньше. Истина, если левое значение строго меньше правого.>=Больше или равно. Истина, если левое значение больше правого или равно ему.<=Меньше или равно. Истина, если левое значение меньше правого или равно ему.age = 20
print(age >= 18) # True
print(age == 21) # False
print(age != 21) # True
Разбор по строкам
age = 20— обычное присваивание, один знак=: в переменнуюageкладём число 20.age >= 18— вопрос «20 больше или равно 18?». Python вычисляет выражение и получаетTrue, это и печатается.age == 21— вопрос «20 равно 21?», два знака равенства. Числа разные, поэтому результат —False.age != 21— вопрос «20 не равно 21?». Раз числа действительно разные, ответ —True.
Один знак = — это присваивание: положить значение в переменную. Два знака == — это сравнение: спросить «они одинаковы?». Перепутать их легко, а Python не всегда предупредит об ошибке — программа просто станет работать не так, как вы задумали.
Сравнивать можно не только числа, но и строки — Python сверяет их посимвольно, и регистр буквы имеет значение:
name = "Alice"
print(name == "Alice") # True
print(name == "alice") # False
Строка "Alice" и строка "alice" для Python — разные значения: заглавная буква A и строчная a занимают разные места в таблице символов. Поэтому второе сравнение выдаёт False, хотя человек прочитал бы оба слова одинаково.
Результат сравнения — обычное значение
Ответ на вопрос необязательно сразу печатать. Как и любое другое значение — число или строку — результат сравнения можно сохранить в переменную и использовать дальше в программе, хоть сразу, хоть через десяток строк.
Официально это называется так: выражение со сравнением вычисляется в значение типа bool, и это значение можно, как и любое другое, присвоить переменной оператором =.
score = 87
passed = score >= 60
print(passed) # True
print(type(passed)) # <class 'bool'>
Разбор по строкам
score = 87— в переменнойscoreсохраняется число 87, например, результат экзамена.passed = score >= 60— справа Python сначала вычисляет сравнение87 >= 60, получаетTrue, а затем это готовое значение сохраняется в новую переменнуюpassed. Никакого особого синтаксиса не нужно: сравнение работает как любое другое выражение справа от=.print(passed)— печатает сохранённое значение,True.print(type(passed))— подтверждает, чтоpassedимеет типbool, хотя выглядит как обычная переменная.
Зачем это всё нужно
Иногда одного вопроса мало: хочется узнать, выполняются ли сразу два условия, или хотя бы одно из них. Для соединения нескольких вопросов в один существуют отдельные логические операции — их разберём подробно в одном из следующих уроков. А вот привычка, которую стоит взять с собой прямо сейчас: результат сравнения — это всегда True или False, и именно на этот ответ дальше в курсе будет опираться программа, когда ей нужно выбрать, какую часть кода выполнить.
Светофор постоянно спрашивает себя: «прошло 30 секунд?». Если ответ True — сигнал переключается. Если False — светофор ждёт и спрашивает снова. Программы устроены так же: получают bool-ответ и в зависимости от него выбирают, что делать дальше. Такой выбор называется ветвлением, а инструмент для него — оператор if, с синтаксисом которого вы познакомитесь в следующем уроке. Пока важно другое: вы уже умеете получать те самые True и False, на которых всё это держится.
Частые ошибки
Соберём вместе ловушки, на которых чаще всего спотыкаются в теме сравнений — чтобы вы узнали их сразу, если встретите.
if age = 18 вместо age == 18 — в Python это вообще не сработает: = внутри условия запрещён синтаксисом языка. Такая ошибка хотя бы сразу видна. Хуже, когда её допускают при обычном присваивании и потом удивляются, почему переменная содержит не тот bool, который ожидали — внимательно считайте знаки равенства.
true и false с маленькой буквы Python не понимает — это не ключевые слова языка, а обычные, ничем не заполненные имена. Код result = true упадёт с ошибкой NameError. Пишите только True и False, с заглавной буквы.
"5" == 5 даёт False, хотя человеку кажется, что это одно и то же «пять». Слева — строка из одного символа, справа — число. Для Python это значения разных типов, и они никогда не окажутся равны напрямую. Если сравниваете результат input() с числом, сначала преобразуйте его функцией int() или float().
Если ждёте от пользователя ответ «Да», а он напечатает «да» или «ДА», сравнение ответ == "Да" даст False — регистр учитывается строго. Приводить строки к одному регистру методом .lower(), с которым вы уже знакомы, вы научитесь применять именно для таких случаев.
Что важно запомнить
True и False. Всегда с заглавной буквы, это ключевые слова языка, а не строки.== != > < >= <= задают Python вопрос и возвращают True или False.= — присваивание. Два == — сравнение. Это разные операции с разным смыслом."5" == 5 всегда False, а сравнение строк учитывает регистр букв.Проверьте себя
4 вопроса
Булевы значения
Создай две переменные a = 10 и b = 20. Затем создай булевы переменные:
is_equal— результат сравненияa == bis_not_equal— результат сравненияa != bis_less— результат сравненияa < b
Выведи значения всех трёх переменных через пробел.
Операторы сравнения
Даны две переменные:
x = 42
y = 15
Создай булевы переменные с результатами:
result_ge—x >= yresult_le—x <= yresult_eq—x == y
Выведи их через пробел.
Чётное или нечётное
Даны три числа: n1 = 8, n2 = 7, n3 = 0. Определи чётность каждого из них и сохрани ответы в переменные is_even1, is_even2, is_even3 — значение True, если число делится на 2 без остатка, иначе False.
Подсказка: остаток от деления числа на 2 (оператор %, который вы уже проходили в теме арифметики) у чётных чисел всегда равен 0.
Пример: для n1 = 8 должно получиться is_even1 = True.