Выбор
и повторение

Ветвления и сложные условия. Цикл с условием.
10 класс, углублённый уровень — занятие четвёртое.

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

Ветвление: работает ровно одна ветка

if x > 100:
    print("больше ста")
elif x > 10:
    print("больше десяти")
else:
    print("маленькое")

Условия проверяются сверху вниз. Выполняется первое подошедшее, остальные не вычисляются вовсе.

Ловушка 1: недостижимая ветка

Так — неверно

if x > 10:
    print("больше десяти")
elif x > 100:
    print("больше ста")

При x = 500 напечатается «больше десяти».

Так — верно

if x > 100:
    print("больше ста")
elif x > 10:
    print("больше десяти")

Сначала узкое условие, потом широкое.

Лестница или несколько if?

Лестница elif

n = 12
if n % 2 == 0:
    print("чётное")
elif n % 3 == 0:
    print("кратно трём")
чётное

Два отдельных if

n = 12
if n % 2 == 0:
    print("чётное")
if n % 3 == 0:
    print("кратно трём")
чётное
кратно трём

Сложные условия

ОперацияИстинна, когдаПриоритет
not AA ложно1 — раньше всех
A and Bистинны обе2
A or Bистинна хотя бы одна3 — позже всех
x > 0 or x < -5 and x % 2 == 0

# читается как:
x > 0 or (x < -5 and x % 2 == 0)

Ловушка 2: «или» по-русски и по-питоновски

Хочется написать так

if x == 1 or 2:
    print("подходит")

Ошибки нет. Программа запускается.

А смысл — такой

if (x == 1) or (2):
    print("подходит")

Число 2 истинно всегда, значит и условие истинно всегда.

Короткое замыкание

x = 0
print(x != 0 and 10 // x > 1)    False

Деления на ноль не произошло. and вычислил левую часть, увидел False — и правую часть не стал считать вовсе: результат уже известен.

Закон де Моргана

НаписаноТо же самое
not (A and B)not A or not B
not (A or B)not A and not B

Словами: «неверно, что оба» — значит «хотя бы один нет».
«Неверно, что хоть один» — значит «ни один».

Цикл с условием

Когда заранее неизвестно, сколько раз повторять.

while: повторять, пока верно

for — шагов известно

for d in range(1, n + 1):
    if n % d == 0:
        print(d)

«Перебрать все числа от 1 до n».

while — шаги считает задача

years = 0
while total < goal:
    total += total // 10
    years += 1

«Пока не накопили нужное».

Ловушка 3: условие проверяется ПЕРЕД телом

total = 20000
goal  = 19999
years = 0
while total < goal:      # 20000 < 19999 — ложь с самого начала
    total += total // 10
    years += 1
print(years)             0

Тело не выполнилось ни разу — и это правильный ответ: копить не надо, цель уже достигнута.

Ловушка 4: вечный цикл

Забыли шаг

i = 1
while i < 10:
    print(i)

i не меняется — условие истинно всегда.

Шаг не туда

n = 100
while n != 1:
    n = n - 3

«Ровно 1» не наступит: 100, 97, … 4, 1 — повезло. А при 101 — мимо.

Четыре приёма, которые понадобятся всюду

ПриёмКак выглядитПример задачи
счётчикk = k + 1сколько шагов до цели
накопительs = s + n % 10сумма цифр числа
перебор цифрwhile n > 0: … n = n // 10задание 25 ЕГЭ
максимумif d > m: m = dнаибольшая цифра
n = 4728
s = 0
while n > 0:
    s = s + n % 10      # взять последнюю цифру
    n = n // 10         # отрезать её
print(s)                21

break и continue

break — выйти совсем

d = 2
while d * d <= n:
    if n % d == 0:
        break
    d = d + 1

Нашли делитель — дальше искать незачем.

continue — пропустить шаг

while i < 10:
    i = i + 1
    if i % 3 == 0:
        continue
    s = s + i

Кратные трём в сумму не попадут.

Задание 13 ЕГЭ: исполнитель

A. Прибавь 1 — увеличивает число на экране на единицу.

B. Поменяй местами — меняет местами цифры двух младших разрядов. Применяется только к числу, у которого цифра десятков меньше цифры единиц.

# команды A, B, A — на экране 13
13 --A--> 14 --B--> 41 --A--> 42

Что делаем сегодня

№ПрограммаРади чего
1Календарь: сколько дней в месяце и високосный ли год лестница elif, сложное условие, вложенное ветвление
2Исполнитель: выполнить программу из команд A и B (команды вводятся по одной) цикл с условием и ветвление внутри него; задание 13 ЕГЭ
3Накопления: через сколько лет вклад дорастёт до цели while со счётчиком, условие выхода

Как работаем

  1. Открываем практикум из общей папки — сначала тренажёр: двенадцать задач на чтение кода, оценки за него нет.
  2. Пишем три программы в IDLE, сохраняем в свою папку как zadanie1.py, zadanie2.py, zadanie3.py.
  3. Запускаем Проверка.bat → «Найти мои файлы» → «Проверить всё».
  4. Показываем отметку с экрана.
Приглашений в input() быть не должно: input(), а не input("Введите год: "). Вывод читает машина.

Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно, оболочка каждый раз показывает, на каких данных программа ошиблась.

За работу

Сначала тренажёр, потом три программы.

Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение кода, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды