Модуль 7 · Урок 7.2
Итог курса
Весь курс на одной странице: как росла одна задача, карта навыков, порядок работы над новой задачей, частые ошибки и задания ЕГЭ.
Шесть модулей позади: от первого print до программы, которая читает файл и сама сообщает об ошибках. Здесь весь курс на одной странице: как росла одна задача, какие навыки ты собрал, как браться за новую задачу и куда идти дальше.
Читай сверху вниз. Если строка карты не вспоминается сразу — ссылка ведёт на урок, где это объяснено.
Одна задача — весь курс
Сумма и наибольшее из 5, −2, 10, 7 прошли через весь курс — и каждый модуль добавлял к решению новый инструмент. Пролистай версии: точками отмечены строки, которых не было в предыдущей.
- Урок 2.2, «Ветвление»: четыре имени и три if. Точками отмечены новые строки каждой версии.
- Урок 3.1, «Цикл while»: один if в цикле числа — до нуля.
- Урок 3.2, «Цикл for»: количество известно: for и range.
- Урок 4.2, «Списки»: все числа сразу: список.
- Урок 4.6, «Функции коллекций»: цикл внутри sum и max.
- Урок 5.2, «Функция»: решение — функция, return двух значений.
- Урок 5.4, «Сортировка»: не одно наибольшее, а два.
- Урок 6.1, «Файлы»: числа из файла, best = None.
- Урок 6.2, «Исключения»: пустой список — понятная ошибка.
- Урок 7.1, «Своя программа»: три функции, запуск из терминала. Задача та же, что в модуле 2, — выросли инструменты.
Задача не менялась — менялся способ: сначала каждое число отдельным именем, потом цикл, список, готовые sum и max, функция, файл и, наконец, программа, которая проверяет вход. Так и растёт умение программировать.
Карта навыков
Каждый модуль дал несколько навыков, и любая программа собирается из них. Сверху — путь данных в любой программе, ниже — по блоку на модуль. Заголовок блока ведёт к его первому уроку.
- Данныеввод, файл, строка — в числа и коллекции
- Обработкаусловия, циклы, функции, готовые средства
- Результатвывод в нужном формате, проверка крайних случаев
1Старт
print(…)показать значение; выражение без print молчитx = …имя связывается со значением//,%частное и остаток; / даёт дробноеint(input())ввод — всегда строка
2Условия
and,or,notправая часть — только если нужнаif / elif / elseвыполняется одна веткаx == 2 or x == 3сравнение в каждой части
3Циклы
while условиепока истинно; тело меняет состояниеrange(a, b)от a до b − 1total,bestнакопитель и лучший — по ходу цикла
4Строки и коллекции
s[a:b]срез, b не входит- списокпо порядку, меняется на месте
- словарьзначение по ключу, частоты
- множествобез повторов, быстрое in
5Функции
def … returnдоговорённость: что принимает, что возвращаетreturn a, bдва результата кортежемsorted(…, key=…)порядок по ключу@cacheрекурсия без повторных вызовов
6Файлы и инструменты
with open(…)файл по строкам, заголовок отдельноtry / exceptтолько ожидаемая ошибкаCounter,productчастоты и перебор слов готовымиO(n²)сначала порядок роста, потом секунды
Новая задача
Незнакомую задачу решают одним и тем же порядком из пяти шагов. Каждому шагу ты уже учился — под ним номера уроков:
Пример руками — это то же, что запуск по шагам в уроках: выписать значения переменных после каждой строки. А в проверку всегда входят пустой вход, один элемент и отрицательные числа, как в уроке об исключениях.
Частые ошибки
Восемь ошибок встречаются чаще других, и каждую ловит один вопрос к себе. Выбери ошибку — увидишь, как её исправить, и вопрос, который её ловит:
- range(a, b)
range(1, 10)→range(1, 11). Спроси себя: какое последнее число нужно? b в range не входит.урок 3.2- x == 2 or 3
x == 2 or 3→x == 2 or x == 3. Спроси себя: с чем сравнивается каждая часть or?урок 2.1- best = 0
best = 0→best = numbers[0]. Спроси себя: что, если все числа отрицательные?урок 2.2- b = a
b = a→b = a.copy(). Спроси себя: нужен второй список или второе имя того же?урок 4.2- a = a.sort()
a = a.sort()→a.sort(). Спроси себя: метод меняет список или возвращает новый? sort возвращает None.урок 5.4- int(2.9)
int(2.9)→round(2.9). Спроси себя: отбросить дробную часть или округлить? int отбрасывает.урок 1.4- заголовок файла
sum(int(line) for line in file)→count = int(file.readline()). Спроси себя: первая строка — данные или описание формата?урок 6.1- map дважды
sum(m), max(m)→m = list(map(…)). Спроси себя: источник одноразовый? map после прохода пуст.урок 6.3
Куда дальше
Задания ЕГЭ, которые решают программой, опираются на модули курса. Номер задания ведёт на тему сайта. В теме разобраны приёмы самого задания — пары делителей, окна, обход графа, выигрышные позиции, — а язык для них уже твой.
| Модуль курса | Задания ЕГЭ |
|---|---|
| 2–3. Условия и циклы | 2 таблицы истинности; 5 формальное исполнение алгоритма; 6 простейшие алгоритмы для исполнителей; 12 исполнение алгоритма; 15 законы математической логики |
| 4. Строки и коллекции | 9 электронные таблицы; 17 числовая последовательность; 24 символьная информация |
| 5. Функции | 16 рекуррентные выражения; 19–21 выигрышная стратегия; 23 анализ графов; 26 обработка данных с сортировкой |
| 6. Файлы и инструменты | 8 перебор слов; 10 маска подсети; 14 системы счисления; 25 целочисленная информация; 27 анализ данных |
Кроме тем ЕГЭ, у курса есть три дополнительных урока: классы, дополнительные механизмы языка и тесты. Они не нужны для экзамена, но с них начинаются большие программы.
Итог
Курс пройден: одна задача выросла от трёх if до программы. Вот что взять с собой.
- Путь данныхДанные → обработка → результат в нужном формате.
- Новая задачаПонять, пример руками, состояние, код, проверка — и назад к примеру, если не сошлось.
- ПроверкаПустой вход, один элемент, отрицательные числа, повторы.
- ОшибкиГраница
range, начало максимума,b = a, результатsort, заголовок файла. - ДальшеТемы ЕГЭ на сайте: язык для них уже есть.
Проверьте себя
Ответь сначала сам, потом открой ответ.
Нужно для миллиона чисел проверять, встречалось ли число раньше. Какую структуру взять и почему?
ОтветСкрыть ответ
Множество: x in seen — примерно один шаг, а в списке — проход по всем элементам.
Что напечатает print(list(range(2, 10, 3)))?
ОтветСкрыть ответ
[2, 5, 8]: шаг 3, а 10 не входит.
Поиск наибольшего начали с best = 0. Что получится для [-4, -2]?
ОтветСкрыть ответ
0 — числа, которого в списке нет. Начинать надо с первого элемента или с None.
Функция f печатает результат через print, но не возвращает его. Что окажется в x после x = f(3)?
ОтветСкрыть ответ
None: без return функция ничего не возвращает.
В файле первая строка — количество чисел, дальше сами числа. Как прочитать его, чтобы количество не попало в сумму?
ОтветСкрыть ответ
Сначала int(file.readline()) — заголовок, затем цикл по файлу: он продолжит со второй строки.
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Напиши функцию: последняя цифра степени
Напиши функцию last_digit(base, power), которая находит последнюю цифру base ** power, не вычисляя саму степень: на каждом шаге храни только последнюю цифру произведения. Напечатай last_digit(7, 4) и last_digit(2, 100) одним print, запусти и запиши, что напечатала программа.
Запишите две цифры через пробел: для 7⁴, затем для 2¹⁰⁰.
Подсказка
result = result * base % 10 в цикле из power шагов: последняя цифра произведения зависит только от последних цифр множителей.
Разбор
Например:
def last_digit(base, power): result = 1 for _ in range(power): result = result * base % 10 return result print(last_digit(7, 4), last_digit(2, 100))7⁴ = 2401; у степеней двойки последние цифры идут по кругу 2, 4, 8, 6, и сотая степень заканчивается на 6. Готовый способ — pow(2, 100, 10).
Ответ: 1 6
Напиши функцию: второе различное наибольшее
Напиши функцию second_max(numbers): она возвращает второе по величине **различное** значение списка или None, если различных значений меньше двух. Напечатай second_max([9, 9, 4, 7]) и second_max([5, 5]) одним print, запусти и запиши, что напечатала программа.
Запишите два значения через пробел, как их напечатала программа.
Подсказка
Множество убирает повторы, sorted(…, reverse=True) ставит наибольшие вперёд.
Разбор
Например:
def second_max(numbers): unique = sorted(set(numbers), reverse=True) if len(unique) < 2: return None return unique[1] print(second_max([9, 9, 4, 7]), second_max([5, 5]))Различные значения первого списка — 9, 7, 4, второе из них 7. Во втором списке различное значение одно.
Ответ: 7 None
Напиши функцию: повторы без нарушения порядка
Напиши функцию unique_in_order(items): она возвращает список первых появлений элементов в исходном порядке. Напечатай unique_in_order("abracadabra"), запусти и запиши, что напечатала программа.
Запишите список так, как его печатает Python.
Подсказка
Множество seen отвечает на «уже было?», список — хранит порядок.
Разбор
Например:
def unique_in_order(items): seen = set() result = [] for item in items: if item not in seen: seen.add(item) result.append(item) return result print(unique_in_order("abracadabra"))Буквы впервые появляются в порядке a, b, r, c, d.
Ответ: ['a', 'b', 'r', 'c', 'd']
Напиши функцию: первое самое длинное слово
Напиши функцию first_longest(text): она возвращает первое самое длинное слово строки (слова разделены пробелами) или None, если слов нет. Напечатай first_longest("кот дом окно"), first_longest("кот дом") и first_longest("") одним print, запусти и запиши, что напечатала программа.
Запишите три значения через пробел, как их напечатала программа.
Подсказка
max(…, key=len) при равных длинах оставляет первое; для пустого списка слов нужен default=None.
Разбор
Например:
def first_longest(text): return max(text.split(), key=len, default=None) print(first_longest("кот дом окно"), first_longest("кот дом"), first_longest(""))«кот» и «дом» одной длины — max возвращает первое.
Ответ: окно кот None
Напиши функцию: правильные скобки
Напиши функцию valid(text) для строки из ( и ): строка правильная, если ни одна скобка не закрывается раньше, чем открыта, и к концу все открытые закрыты. Напечатай valid("(()())"), valid(")(") и valid("(()") одним print, запусти и запиши, что напечатала программа.
Запишите три значения через пробел, как их напечатала программа.
Подсказка
Счётчик открытых скобок: ( прибавляет 1, ) вычитает; ниже нуля — сразу False, в конце должен быть 0.
Разбор
Например:
def valid(text): balance = 0 for char in text: if char == "(": balance += 1 else: balance -= 1 if balance < 0: return False return balance == 0 print(valid("(()())"), valid(")("), valid("(()"))В )( скобок поровну, но первая закрывается до открытия; в (() одна осталась открытой.
Ответ: True False False