Условия
Учим программу выбирать, что делать. if, сравнения, and и or, отступы. Половина ошибок на ЕГЭ живёт именно в условиях, поэтому тут много ловушек.
if и else
До сих пор программа выполняла все строки подряд. if позволяет выполнить кусок кода только когда условие верно.
n = int(input()) if n % 2 == 0: print(n, 'чётное') else: print(n, 'нечётное') print('Готово')
Поменяй 14 на 7 и запусти ещё раз. Устроено так:
- после
ifпишем условие и двоеточие; - строки, которые выполняются при верном условии, сдвинуты на 4 пробела вправо;
elseзначит «иначе», у него тоже двоеточие и свой сдвинутый блок;print('Готово')без отступа, он уже не внутриif, поэтому выполняется всегда.
В Python отступ это не украшение. Именно по нему Python понимает, где кончается if. Отступ всегда 4 пробела. В редакторе на сайте и в IDLE клавиша Tab ставит их сама.
else можно не писать, если в противном случае делать ничего не надо:
x = int(input()) if x < 0: x = -x # меняем знак, если число отрицательное print('Модуль:', x)
Сравнения
| Знак | Значит |
|---|---|
== | равно |
!= | не равно |
< > | меньше, больше |
<= >= | меньше или равно, больше или равно |
Главное: равно пишется двумя знаками ==. Один знак = это «положи в переменную», про это была тема 1.
Результат сравнения это True (правда) или False (ложь). Его можно просто вывести:
x = 7 print(x > 5) print(x == 10) print(x != 10)
В Python есть удобная запись двойного неравенства, как в математике:
x = 7 print(1 <= x <= 10) # x от 1 до 10 включительно
True и False ведут себя как числа 1 и 0. Это пригодится в №2, где таблицы истинности пишут нулями и единицами:
print(True + True) print(int(5 > 3))
elif и границы
Когда вариантов больше двух, между if и else ставят elif (сокращение от else if). Python проверяет условия сверху вниз и выполняет только первый подходящий блок.
score = int(input()) # баллы за пробник if score >= 80: print('Оценка 5') elif score >= 60: print('Оценка 4') elif score >= 40: print('Оценка 3') else: print('Оценка 2')
Попробуй ввести 79, 80 и 39. Почему во второй строке достаточно score >= 60, без «и меньше 80»? Потому что до elif дело дойдёт, только если первое условие уже не сработало. Значит, тут точно score < 80.
Если поставить score >= 40 первым, то 95 баллов получат оценку 3: условие верное, блок выполнится, а до остальных Python даже не дойдёт. Идём от самого строгого условия к самому слабому.
Противоположное условие
Что противоположно x < 40? Хочется сказать x > 40, но тогда потеряется само 40. Правильно x >= 40.
| Условие | Противоположное |
|---|---|
x < 40 | x >= 40 |
x > 40 | x <= 40 |
x == 40 | x != 40 |
На ЕГЭ это всплывает в формулировках «не меньше», «не больше», «больше». «Не меньше 40» значит >= 40, сорок подходит.
Что выведет программа?
a = 17 b = 5 if a % b == 0: print(a // b) elif a > 10: print(a - b) else: print(a + b)
Подсказка
Сначала реши в голове, потом скопируй код в любой блок выше и проверь.
and, or, not
Условия можно соединять:
| Python | Значит | Верно, когда |
|---|---|---|
a and b | и | верны оба |
a or b | или | верно хотя бы одно |
not a | не | a ложно |
n = int(input()) if n % 3 == 0 and n % 5 == 0: print('делится и на 3, и на 5') if n % 3 == 0 or n % 5 == 0: print('делится хотя бы на одно из них') if not n % 2 == 0: print('нечётное')
Поиграй с вводом: 15, 9, 7, 10.
Скобки
Python выполняет сначала not, потом and, потом or. Это как умножение раньше сложения. Если в условии есть и and, и or, ставь скобки, даже если и так работает: так и тебе понятнее, и ошибиться сложнее.
Классический пример: високосный год. Год високосный, если делится на 4 и не делится на 100, или если делится на 400.
y = int(input()) if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0: print(y, 'високосный, 366 дней') else: print(y, 'обычный, 365 дней')
Проверь 2024, 2100 и 2000.
Сколько дней в 1900 году? Запусти код про високосный год.
Что выведет print(int((3 <= 5) and not (2 == 2)))? Ответ 0 или 1.
Сломай код
Первые три ошибки Python найдёт сам. Последние две он не заметит, и это хуже: программа работает, но ответ неверный.
Один знак равно
x = 5 if x = 5: print('пять')
SyntaxError. В условии нужно ==. Python 3 обычно сам подсказывает это в сообщении.
Забытое двоеточие
x = 5 if x > 0 print('положительное')
expected ':', то есть ждал двоеточие. Двоеточие нужно после if, elif и else.
Нет отступа
x = 5 if x > 0: print('положительное')
expected an indented block: после двоеточия Python ждёт хотя бы одну сдвинутую строку.
Тихая ошибка: or без второго сравнения
x = 7 if x == 1 or 2: print('x это 1 или 2')
Хотели проверить «x равно 1 или 2», а условие сработало для 7. Python читает это как (x == 1) or 2, а число 2 само по себе считается правдой. Правильно так:
x = 7 if x == 1 or x == 2: print('x это 1 или 2') else: print('нет')
Тихая ошибка: print не в том блоке
x = int(input()) if x > 10: print('большое') print('проверка закончена')
Строка «проверка закончена» должна выводиться всегда, но она сдвинута и попала внутрь if. При вводе 3 программа молчит. Убери у последней строки отступ и запусти снова.
Тихие ошибки ловятся только проверкой на нескольких входах. Подставь число, где условие должно сработать, число, где не должно, и число ровно на границе.
Где пригодится на ЕГЭ
| Номер | Что из темы |
|---|---|
| №2 | and, or, not, сравнения как 0 и 1, скобки |
| №15 | длинные логические выражения, проверка для каждого x |
| №5 | «если число чётное, то…»: if n % 2 == 0 |
| №8 | условия на слово внутри if |
| №25 | несколько условий делимости через and |
В №2 и №15 есть ещё две логические операции, которых в Python нет отдельным словом. Их записывают через сравнение:
| Логика | Python |
|---|---|
| a → b (следование) | a <= b |
| a ≡ b (равносильность) | a == b |
Почему следование это <=, разберём в уроке по №2. Пока просто запомни, что это стандартный приём.
x, y = 1, 0 print(int(x <= y)) # 1 → 0 даёт 0, единственный ложный случай print(int(y <= x)) # 0 → 1 даёт 1
Чему равно выражение (x → y) ∧ ¬z при x = 0, y = 0, z = 0? Ответ 0 или 1.
Код в блоках можно менять и запускать. В блоках с полем «Ввод» меняй число и смотри, как меняется ответ.