$ sudo teach IT
Модуль 3 · Условия · Урок 3.1

Логика и сравнения

Учимся задавать Python вопросы и понимать, что означают его ответы — True и False.

Теория + практика~20 минутНовичок

Каждый сайт, которым вы пользуетесь, постоянно что-то решает: пускать вас дальше или нет, показывать скидку или нет, принимать пароль или отклонять. За любым таким решением стоит один и тот же приём: программа задаёт себе вопрос и получает один из двух ответов — да или нет. В этом уроке разберёмся, как Python называет такие ответы и как самим задавать ему вопросы — сравнивая числа, строки и переменные между собой.

Всего два ответа: True и False

Представьте помощника, который никогда не отвечает «может быть» или «как посмотреть». На любой вопрос он говорит либо «да», либо «нет» — и третьего варианта не существует. Python ведёт себя точно так же: когда его о чём-то спрашивают, он всегда возвращает один из двух ответов, без полутонов.

У этих двух ответов в Python есть официальные имена — True (истина) и False (ложь). Это не текст в кавычках и не обычные слова, а ключевые слова языка: пишутся строго с заглавной буквы, без кавычек, и зарезервированы Python специально для этого. Тип данных, которому принадлежат такие значения, называется bool (булев тип) — такой же полноценный тип, как знакомые вам int (числа) и str (строки).

Python · значения типа bool
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.

==Равно. Спрашивает, одинаковые ли значения. Два знака равенства — не путайте с присваиванием.
!=Не равно. Истина, если значения различаются.
>Больше. Истина, если левое значение строго больше правого.
<Меньше. Истина, если левое значение строго меньше правого.
>=Больше или равно. Истина, если левое значение больше правого или равно ему.
<=Меньше или равно. Истина, если левое значение меньше правого или равно ему.
Python · сравнение чисел
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 сверяет их посимвольно, и регистр буквы имеет значение:

Python · сравнение строк
name = "Alice"

print(name == "Alice")   # True
print(name == "alice")   # False

Строка "Alice" и строка "alice" для Python — разные значения: заглавная буква A и строчная a занимают разные места в таблице символов. Поэтому второе сравнение выдаёт False, хотя человек прочитал бы оба слова одинаково.

Результат сравнения — обычное значение

Ответ на вопрос необязательно сразу печатать. Как и любое другое значение — число или строку — результат сравнения можно сохранить в переменную и использовать дальше в программе, хоть сразу, хоть через десяток строк.

Официально это называется так: выражение со сравнением вычисляется в значение типа bool, и это значение можно, как и любое другое, присвоить переменной оператором =.

Python · сравнение сохраняем в переменную
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

true и false с маленькой буквы Python не понимает — это не ключевые слова языка, а обычные, ничем не заполненные имена. Код result = true упадёт с ошибкой NameError. Пишите только True и False, с заглавной буквы.

Сравнение числа и строки

"5" == 5 даёт False, хотя человеку кажется, что это одно и то же «пять». Слева — строка из одного символа, справа — число. Для Python это значения разных типов, и они никогда не окажутся равны напрямую. Если сравниваете результат input() с числом, сначала преобразуйте его функцией int() или float().

Регистр в сравнении строк

Если ждёте от пользователя ответ «Да», а он напечатает «да» или «ДА», сравнение ответ == "Да" даст False — регистр учитывается строго. Приводить строки к одному регистру методом .lower(), с которым вы уже знакомы, вы научитесь применять именно для таких случаев.

Что важно запомнить

1
bool — тип данных с двумя значениями: True и False. Всегда с заглавной буквы, это ключевые слова языка, а не строки.
2
Операторы сравнения == != > < >= <= задают Python вопрос и возвращают True или False.
3
Один = — присваивание. Два == — сравнение. Это разные операции с разным смыслом.
4
Результат сравнения — такое же значение, как число или строка: его можно сохранить в переменную и использовать дальше.
5
Сравнивать напрямую можно только значения одного типа: "5" == 5 всегда False, а сравнение строк учитывает регистр букв.

Проверьте себя

4 вопроса

Булевы значения

Создай две переменные a = 10 и b = 20. Затем создай булевы переменные:

  • is_equal — результат сравнения a == b
  • is_not_equal — результат сравнения a != b
  • is_less — результат сравнения a < b

Выведи значения всех трёх переменных через пробел.

Операторы сравнения

Даны две переменные:

x = 42
y = 15

Создай булевы переменные с результатами:

  • result_ge — x >= y
  • result_le — x <= y
  • result_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.