True, False и сравнения
Кроме чисел и строк в Python есть третий простой тип — логический. У него ровно два значения: True и False. С заглавной буквы, без кавычек.
print(5 > 3)
print(5 < 3)
print(5 == 5)True False True
Такие значения получаются из сравнений, и сравнений шесть:
== равно
!= не равно
> больше
< меньше
>= больше или равно
<= меньше или равно
Два знака равенства, а не один. Один — это присваивание, и перепутать их значит написать совсем другое:
x = 5 положить 5 в x
x == 5 спросить, равен ли x пяти
Результат сравнения можно положить в переменную, как любое другое значение:
возраст = 20
взрослый = возраст >= 18
print(взрослый)
print(type(взрослый))True <class 'bool'>
Сравнивать можно и строки — на равенство и по алфавиту:
print("Аня" == "Аня")
print("абрикос" < "банан")True True
if, else, elif
if выполняет кусок программы только тогда, когда условие истинно.
балл = 72
if балл >= 60:
print("сдал")сдал
Форма строгая, и в ней три обязательных части: слово if, условие, двоеточие в конце строки. Всё, что относится к условию, пишется с отступом.
if условие:
это выполнится, если условие истинно
и это тоже
это выполнится всегда
Отступ в Python — это синтаксис, а не оформление. В других языках блок задают фигурными скобками, здесь — сдвигом вправо. Отступ обычно четыре пробела; главное, чтобы внутри одного блока он был одинаковым.
else добавляет вторую ветку — на случай, когда условие ложно:
балл = 45
if балл >= 60:
print("сдал")
else:
print("не сдал")не сдал
Сработает ровно одна из двух веток, никогда обе и никогда ни одной.
elif — это «иначе если». Так строят цепочку из нескольких проверок:
балл = 82
if балл >= 90:
print("отлично")
elif балл >= 75:
print("хорошо")
elif балл >= 60:
print("удовлетворительно")
else:
print("не сдал")хорошо
Условия можно вкладывать друг в друга — тогда отступ становится двойным:
возраст = 25
стаж = 3
if возраст >= 18:
if стаж >= 1:
print("подходит")
else:
print("мало стажа")
else:
print("рано")подходит
Читается это тяжелее, чем связка and, и почти всегда вложенность можно развернуть в плоскую цепочку. Вкладывать стоит тогда, когда внутренние проверки имеют смысл только при выполненной внешней.
Ещё одна частая форма — условие без else вовсе:
цена = 1200
if цена > 1000:
цена = цена * 0.9
print(цена)1080.0
Здесь if не выбирает между двумя путями, а меняет значение при особом случае. Строка print без отступа выполняется в любом случае, и это ровно то, что нужно.
and, or, not
Условия можно соединять. Слов три, и они пишутся словами, а не знаками.
and и — истинно, когда истинны оба
or или — истинно, когда истинно хотя бы одно
not не — переворачивает
возраст = 25
стаж = 3
print(возраст >= 18 and стаж >= 1)
print(возраст < 18 or стаж >= 1)
print(not возраст < 18)True True True
Порядок старшинства: сначала not, потом and, потом or. Скобки ставят, когда иначе непонятно:
print(True or False and False)
print((True or False) and False)True False
Первая строка: and старше, поэтому считается True or (False and False) — это True.
Проверка вычисляется не до конца, если ответ уже ясен. Это называется коротким замыканием, и на нём стоит важный приём:
имя = ""
if имя != "" and имя[0] == "А":
print("да")
else:
print("нет")нет
Первая часть ложна, значит вся связка and ложна, и имя[0] не выполняется — иначе была бы ошибка обращения к пустой строке. Поэтому проверку «есть ли вообще» ставят первой.
not переворачивает значение, и чаще всего его пишут перед проверкой вхождения или перед именем-признаком:
города = ["Москва", "Казань"]
if "Пермь" not in города:
print("нет в списке")нет в списке
Обратите внимание на запись not in — она читается как по-английски и пишется двумя словами подряд. То же самое можно было бы написать как not ("Пермь" in города), но так почти никто не делает.
Отрицание удобно, когда условие проще сформулировать «от противного»:
готово = False
if not готово:
print("ещё работаем")ещё работаем
Двойное отрицание читать трудно. Если условие получилось вида not (a and not b) — почти всегда его стоит переписать: обычно оно равно чему-то простому.