К содержанию

Модуль 7 · Урок 7.2

Итог курса

Весь курс на одной странице: как росла одна задача, карта навыков, порядок работы над новой задачей, частые ошибки и задания ЕГЭ.

5 задач

Шесть модулей позади: от первого print до программы, которая читает файл и сама сообщает об ошибках. Здесь весь курс на одной странице: как росла одна задача, какие навыки ты собрал, как браться за новую задачу и куда идти дальше.

Читай сверху вниз. Если строка карты не вспоминается сразу — ссылка ведёт на урок, где это объяснено.

Одна задача — весь курс

Сумма и наибольшее из 5, −2, 10, 7 прошли через весь курс — и каждый модуль добавлял к решению новый инструмент. Пролистай версии: точками отмечены строки, которых не было в предыдущей.

  1. Урок 2.2, «Ветвление»: четыре имени и три if. Точками отмечены новые строки каждой версии.
  2. Урок 3.1, «Цикл while»: один if в цикле числа — до нуля.
  3. Урок 3.2, «Цикл for»: количество известно: for и range.
  4. Урок 4.2, «Списки»: все числа сразу: список.
  5. Урок 4.6, «Функции коллекций»: цикл внутри sum и max.
  6. Урок 5.2, «Функция»: решение — функция, return двух значений.
  7. Урок 5.4, «Сортировка»: не одно наибольшее, а два.
  8. Урок 6.1, «Файлы»: числа из файла, best = None.
  9. Урок 6.2, «Исключения»: пустой список — понятная ошибка.
  10. Урок 7.1, «Своя программа»: три функции, запуск из терминала. Задача та же, что в модуле 2, — выросли инструменты.

Задача не менялась — менялся способ: сначала каждое число отдельным именем, потом цикл, список, готовые sum и max, функция, файл и, наконец, программа, которая проверяет вход. Так и растёт умение программировать.

Карта навыков

Каждый модуль дал несколько навыков, и любая программа собирается из них. Сверху — путь данных в любой программе, ниже — по блоку на модуль. Заголовок блока ведёт к его первому уроку.

  1. Данныеввод, файл, строка — в числа и коллекции
  2. Обработкаусловия, циклы, функции, готовые средства
  3. Результатвывод в нужном формате, проверка крайних случаев

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 − 1
  • total, 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, заголовок файла.
  • ДальшеТемы ЕГЭ на сайте: язык для них уже есть.

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1

Нужно для миллиона чисел проверять, встречалось ли число раньше. Какую структуру взять и почему?

ОтветСкрыть ответ
Ответ

Множество: x in seen — примерно один шаг, а в списке — проход по всем элементам.

Вопрос 2

Что напечатает print(list(range(2, 10, 3)))?

ОтветСкрыть ответ
Ответ

[2, 5, 8]: шаг 3, а 10 не входит.

Вопрос 3

Поиск наибольшего начали с best = 0. Что получится для [-4, -2]?

ОтветСкрыть ответ
Ответ

0 — числа, которого в списке нет. Начинать надо с первого элемента или с None.

Вопрос 4

Функция f печатает результат через print, но не возвращает его. Что окажется в x после x = f(3)?

ОтветСкрыть ответ
Ответ

None: без return функция ничего не возвращает.

Вопрос 5

В файле первая строка — количество чисел, дальше сами числа. Как прочитать его, чтобы количество не попало в сумму?

ОтветСкрыть ответ
Ответ

Сначала int(file.readline()) — заголовок, затем цикл по файлу: он продолжит со второй строки.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Напиши функцию: последняя цифра степени

Напиши функцию last_digit(base, power), которая находит последнюю цифру base ** power, не вычисляя саму степень: на каждом шаге храни только последнюю цифру произведения. Напечатай last_digit(7, 4) и last_digit(2, 100) одним print, запусти и запиши, что напечатала программа.

Запишите две цифры через пробел: для 7⁴, затем для 2¹⁰⁰.

Напиши функцию: второе различное наибольшее

Напиши функцию second_max(numbers): она возвращает второе по величине **различное** значение списка или None, если различных значений меньше двух. Напечатай second_max([9, 9, 4, 7]) и second_max([5, 5]) одним print, запусти и запиши, что напечатала программа.

Запишите два значения через пробел, как их напечатала программа.

Напиши функцию: повторы без нарушения порядка

Напиши функцию unique_in_order(items): она возвращает список первых появлений элементов в исходном порядке. Напечатай unique_in_order("abracadabra"), запусти и запиши, что напечатала программа.

Запишите список так, как его печатает Python.

Напиши функцию: первое самое длинное слово

Напиши функцию first_longest(text): она возвращает первое самое длинное слово строки (слова разделены пробелами) или None, если слов нет. Напечатай first_longest("кот дом окно"), first_longest("кот дом") и first_longest("") одним print, запусти и запиши, что напечатала программа.

Запишите три значения через пробел, как их напечатала программа.

Напиши функцию: правильные скобки

Напиши функцию valid(text) для строки из ( и ): строка правильная, если ни одна скобка не закрывается раньше, чем открыта, и к концу все открытые закрыты. Напечатай valid("(()())"), valid(")(") и valid("(()") одним print, запусти и запиши, что напечатала программа.

Запишите три значения через пробел, как их напечатала программа.