Начнем с известных всем операторов. Проверим,
8 < 9 # правда
True
9 > 10 # неправда
False
Результат такой проверки имеет логический тип (boolean).
res = 8 < 9
res
True
Как мы уже обсуждали, переменные такого типа могут принимать два значения True
или False
. Обратите внимание, что True
и False
не заключены в кавычки – добавив кавычки, мы получим строки "True" и "False" (тип string).
"True" == True
False
При проверке равенства двух частей (переменных, списков и так далее) используется двойной знак равенства.
6 == 6
True
Одинарный знак «равно» используется для присваивания значений. Так ничего не сравним, но сохраним в переменную a
число 6:
a = 6
a
6
А так уже проверим условия:
print(a == 6)
print(a == 9)
True False
Отрицание равенства в Python обозначается с помощью оператора !=
(вообще !
в программировании используется для отрицания).
6 != 7
True
Стоит отметить, что Python достаточно лояльно относится к разделению между типам данных. Например, если мы сравним целое число и то же число, но с плавающей точкой (с дробной частью равной 0), Python сообщит, что эти числа совпадают.
6 == 6.0 # верно
True
Пусть у нас есть три целочисленные переменные a
, b
и c
, и мы планируем составлять сложные, составные уcловия, касающиеся этих переменных.
a = 3
b = 7
c = 1
Помогут операторы and
и or
. Оператор and
соответствует одновременному выполнению условий, оператор or
соответствует ситуации, когда хотя бы одно из условий выполняется. Оператор or
в Python – обычное «или», не исключающее: либо верно первое условие, либо второе, либо оба.
(a < b) and (b > c) # оба верны
True
(a < b) and (c > b) # второе неверно -> все неверно
False
Вместо and
можно использовать оператор &
, он нам потом ещё пригодится при работе с датафреймами pandas
:
(a < b) & (c > b)
False
(a < b) or (a > c) # первое верное -> хотя бы одно верно
True
Вместо or
можно использовать оператор |
:
(a < b) | (a > c)
True
Исключающее «или» (ровно одно условие верно), которое обычно в программировании представляется оператором xor
, в Python тоже есть, только для него нет «словесного» оператора xor
, а есть только «символьный» – оператор ^
:
(a < b) ^ (a > c) # оба верны -> неверно, что ровно одно верно
False
(a > b) ^ (a > c) # верно только второе - ОК
True
В Python есть еще полезные операторы: оператор принадлежности in
и оператор отрицания not
.
Пусть у нас есть списки отличных, хороших, удовлетворительных и плохих оценок.
excel = [8, 9, 10]
good = [6, 7]
sat = [4, 5]
bad = [1, 2, 3]
Проверим, лежит ли оценка 8 в плохих:
8 in bad
False
Применим отрицание:
8 not in bad # верно!
True
Тут главное не увлечься и не начать писать грамматические фразы вида 8 is not in bad
:) Хотя оператор is
в Python есть и его часто используют, если нужно сравнить какое-то значение с None
или проверить тип объекта:
8 is None # нет
None is None # да
True
# тип integer или нет
a = 3
type(a) is int
True
# главное, кавычки не ставить вокруг типа
type(a) is 'int'
False
А вот это уже too much, хотя красиво и как в естественном языке:
8 is not in bad
File "<ipython-input-24-e2bcc5ac93df>", line 1 8 is not in bad ^ SyntaxError: invalid syntax
Условные конструкции – конструкции с операторами условия. Условная конструкция обычно предполагает «развилку»: если условие выполняется, то должен выполняться один набор действий, если нет – другой набор действий. Давайте напишем программу, которая будет просить пользователя ввести целое число, и если это число менее 10, на экран будет выводиться сообщение "Мало", иначе – "Много". И заодно познакомимся с конструкцией if-else.
x = int(input("Введите число: "))
if x < 10:
print("Мало")
else:
print("Много")
Введите число: 8 Мало
В части с if
мы прописываем условие, в зависимости от которого Python будет делать выбор, что выводить на экран, а после двоеточия перечисляем действия, которые будут выполняться в случае, если x
удовлетворяет условию. В части с else
мы уже не пишем никакого условия – оператор else
сам по себе означает «в случае, если условие в выражении с if
не выполнено».
Часть с else
является необязательной: программа может существовать только с условием if
. Тогда в случае невыполнения условия ничего происходить не будет, Python просто перейдет к следующим строкам кода.
Как быть, если условий несколько? Например, мы просим пользователя ввести число, и если число больше 10, на экране должно быть сообщение "Много", если ровно 10 – "В самый раз", если меньше – "Мало". Условные конструкции можно вкладывать друг друга, главное не забывать при этом про отступы:
if x < 10:
print("Мало")
else:
if x == 10:
print("В самый раз")
else:
print("Много")
Мало
Можно воспользоваться оператором elif
, который по смыслу является сочетанием else + if
: если предыдущее условие невыполнено, то, нужно проверить следующее условие, и если оно тоже не выполнено, то уже перейти к ветке с else
.
if x < 10:
print("Мало")
elif x == 10:
print("В самый раз")
else:
print("Много")
Мало
Ответвлений с elif
может быть несколько: сколько условий, столько и выражений с elif
.
Законный вопрос: а можно ли обойтись совсем без elif
, просто записав несколько выражений с if
? Тут все зависит от ситуации. Иногда решения использовать elif
и if
, не меняя остальной код, будут равнозначными. Если мы перепишем код в примере выше, заменив elif
на if
, ничего не изменится, так как условия будут проверяться последовательно в любом случае: если число меньше 10, будет выведено слово «Мало», если нет – программа перейдет к следующему условию, и так далее.
В случае, когда условия как-то связаны между собой, нужно быть более внимательными. Рассмотрим такой пример.
Случай 1.
mark = int(input("Введите оценку: "))
Введите оценку: 3
if mark < 10:
print("Это нормально")
elif mark == 10:
print("Отлично")
if mark < 6:
print("Плохо")
Это нормально Плохо
Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет – ничего не делаем. При этом, после всех этих действий делаем дополнительную проверку: если оценка меньше 6, выводим "Плохо".
Случай 2.
if mark < 10:
print("Это нормально")
elif mark == 10:
print("Отлично")
elif mark < 6:
print("Плохо")
Это нормально
Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет – сравниваем ее с 6. Если оценка меньше 6, выводим "Плохо".
Почему во втором случае мы не увидели сообщение "Плохо"? Потому что из-за второго elif
мы попросту до него не дошли! На ветку со вторым elif
мы попадаем в случае, если предыдущее условие не выполняется, то есть если оценка не равна 10. А на ветку с первым elif
мы попадем, в случае, если оценка не менее 10. Получается, что мы должны выводить слово "Плохо" в случае, когда оценка более 10 и при этом менее 6, чего в природе не бывает. Использовав elif
необдуманно, мы добавили лишнее условие, которое никогда не будет выполняться! Тут будет полезно вспомнить схемы, которые многие, наверное, видели на уроках информатики в школе. Запоминать их необязательно, просто они хорошо иллюстрируют различия между двумя случаями.
Случай 1
Случай 2
Возможно, предыдущее обсуждение if
и elif
могло вас чуть-чуть запутать, но это не повод расстраиваться. Важно просто помнить, что разница между этими операторами есть. Остальное можно проверить экспериментально на конкретном примере :)
Чтобы еще немного поиграть с условиями, давайте напишем более содержательный код, который будет выдавать комментарий к оценке в 10-балльной шкале (оценка выше 7 – «отлично», выше 5 и ниже 8 – «хорошо», выше 3 и ниже 6 – «удовлетворительно», ниже 4 – «плохо».
Решение 1: несколько вложенных условий с оператором elif
grade = 7
if grade > 7:
print("Отлично")
elif grade > 5:
print("Хорошо")
elif grade > 3:
print("Удовлетворительно")
else:
print("Плохо")
Хорошо
Блок-схема для такого кода:
Решение 2: несколько сложных условий с if
grade = 7
if grade > 7:
print("Отлично")
if (grade > 5) and (grade <= 7):
print("Хорошо")
if (grade > 3) and (grade <= 5):
print("Удовлетворительно")
if grade <= 3:
print("Плохо")
Хорошо
Блок-схема для такого кода:
Могли бы мы использовать else
вместо последнего условия с if
? Давайте проверим!
grade = 7
if grade > 7:
print("Отлично")
if (grade > 5) and (grade <= 7):
print("Хорошо")
if (grade > 3) and (grade <= 5):
print("Удовлетворительно")
else:
print("Плохо") # что-то пошло не так
Хорошо Плохо
Почему получился такой странный результат? Потому что написанная часть с else
относится не ко всем условиям с if
выше, а только в последнему. Давайте посмотрим на блок-схему для такого кода: