урок 4 из 14

Условия

Ветвить программу: логический тип и сравнения, if / elif / else, связки and, or и not.

7 мин чтения · 3 главы ·5 заданий ·домашняя работа

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 выполняет кусок программы только тогда, когда условие истинно.

балл >= 60 ?данет«сдал»«не сдал»дальшепути снова сходятся
Проверка одна, а путей два: программа идёт по тому, где условие сошлось.
балл = 72
if балл >= 60:
    print("сдал")

сдал

Форма строгая, и в ней три обязательных части: слово if, условие, двоеточие в конце строки. Всё, что относится к условию, пишется с отступом.

if условие:
    это выполнится, если условие истинно
    и это тоже
это выполнится всегда

Отступ в Python — это синтаксис, а не оформление. В других языках блок задают фигурными скобками, здесь — сдвигом вправо. Отступ обычно четыре пробела; главное, чтобы внутри одного блока он был одинаковым.

else добавляет вторую ветку — на случай, когда условие ложно:

балл = 45
if балл >= 60:
    print("сдал")
else:
    print("не сдал")

не сдал

Сработает ровно одна из двух веток, никогда обе и никогда ни одной.

балл >= 90 → «отлично»иначе балл >= 75 → «хорошо»иначе балл >= 60 → «удовлетворительно»иначе → «не сдал»порядок важен: 95 подходит и под 90, и под 75, и под 60но сработает только первая строка
Срабатывает первая подошедшая ветка, остальные пропускаются целиком.

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) — почти всегда его стоит переписать: обычно оно равно чему-то простому.

Задания урока

Каждое проверяется сразу: ответ сверяется с эталоном, и на неверный вариант приходит разбор.

  1. В «возраст» лежит 20. Положите в «взрослый» результат проверки «возраст не меньше 18» и напечатайте его.легко
  2. В «остаток» лежит 3. Напечатайте «надо заказать», если остаток меньше 5, и «хватает» иначе.средне
  3. В «балл» лежит 82. Напечатайте «отлично» при 90 и выше, «хорошо» при 75 и выше, «ниже» иначе.средне
  4. В «возраст» 25, в «стаж» 3. Напечатайте «подходит», если возраст не меньше 18 И стаж не меньше 1, иначе «не подходит».средне
  5. В «имя» лежит пустая строка. Напечатайте «первая буква А», только если имя не пустое И начинается на «А». Иначе — «нет».сложно

Практика и материалы по теме курса

Пройти урок с проверкой заданий Курс «Python» открыт и бесплатен, прогресс сохраняется.
Открыть курс