Подсказки по номерам — ориентиры применения Python, а не обязательный способ решения. Темы соотнесены со структурой ЕГЭ по информатике ФИПИ.
Краткие таблицы остаются видимыми
СТАРТ / ПОНЯТНЫЙ ЯЗЫК
Что такое Python и как его читать
Где пригодится на ЕГЭ База для программных решений: № 5, 16, 17, 23–27; чтение простых алгоритмов помогает и в других темах.
Этот справочник можно читать с нуля. Сначала разберись в словах, затем переходи к командам. Примеры — самостоятельные программы; их можно копировать целиком в онлайн Python.
Язык программирования
Формальный язык для записи действий и правил, которые выполняет компьютер. Он задаёт синтаксис — как записывать программу, и семантику — что запись означает.
Python и интерпретатор
Python — язык, а интерпретатор — программа, выполняющая код. В CPython исходный текст обычно сначала компилируется в байткод, который исполняет виртуальная машина. Для начала достаточно писать файл .py и запускать его.
Алгоритм и программа
Алгоритм — последовательность шагов решения. Программа — запись алгоритма на языке программирования. Один алгоритм можно реализовать на разных языках.
«Команда», инструкция и выражение
«Команда» — удобное разговорное слово. Точнее различать инструкции, например присваивание или if, и выражения, которые вычисляют значение, например 2 + 3 или len(s). Вызов print() — выражение с побочным эффектом вывода.
Синтаксис и отступы
После if, for, while, def и других заголовков блока ставят двоеточие. Тело блока выделяется отступом; обычно используют четыре пробела. Не смешивай табуляции и пробелы.
Комментарий
Текст после # до конца строки, вне строкового литерала, не выполняется. Комментарий объясняет замысел; он не заменяет исполняемый код.
Переменная и объект
Имя переменной связывается с объектом. Тип принадлежит объекту, а имя можно связать с другим объектом. Присваивание само по себе не копирует список или словарь.
Тип данных
От типа зависят доступные операции. Основные типы:
int — целые числа. Пример: 12, -7, 0.
float — числа с плавающей точкой. Пример: 2.5, -0.75.
bool — логические значения. Пример: True, False.
str — строки. Пример: "Python", "123".
list — изменяемые списки. Пример: [2, 5, 8].
tuple — неизменяемые кортежи. Пример: (2, 5, 8).
set — множества уникальных элементов. Пример: {2, 5, 8}.
dict — словари: ключ → значение. Пример: {"score": 90}.
Например, 12 + 3 даёт число 15, а "12" + "3" — строку "123". float хранит многие десятичные дроби приближённо.
Изменяемость
Списки, словари и множества можно менять на месте. Строки, числа и кортежи неизменяемы; при этом кортеж может содержать изменяемый список.
Итерируемый объект и итератор
По итерируемому объекту можно пройти циклом for. Итератор помнит текущую позицию и исчерпывается. list и range допускают повторный проход, а map — одноразовый итератор.
Исключение
Сообщение о невозможности выполнить операцию: например деление на ноль или преобразование неподходящей строки. Traceback показывает цепочку вызовов и строку ошибки.
Здесь первые две строки связывают имена с числами, третья вычисляет произведение, четвёртая выводит результат. Оператор = — присваивание; * — умножение; print — встроенная функция.
Почему важно отличать имя от копии
Python 3
a = [1, 2]
b = a
b.append(3)
print(a)
x = 5
y = x
x = 9
print(x, y)
Результат
[1, 2, 3]
9 5
Имена a и b указывают на один список: изменение через b видно через a. Присваивание x = 9 связывает x с другим целым числом; значение y остаётся 5.
СТАРТ / ФУНКЦИИ И МОДУЛИ
Функция, метод, модуль и аргументы
Где пригодится на ЕГЭ № 16, 19–21, 23 — свои функции и повторяющиеся вычисления; № 25 — математические функции; № 8 — itertools.
Функция
Вызываемый объект для отдельной задачи. Вызов записывается с круглыми скобками. Свои функции объявляют через def; многие полезные функции уже встроены в Python и не требуют import.
Своя функция: вычислить квадрат
Python 3
def square(x):
return x * x
result = square(7)
print(result)
Результат
49
x — параметр, 7 — аргумент, return передаёт результат 49 вызывающему коду. print выводит полученное значение.
Встроенная функция: измерить длину
Python 3
word = "Python"
size = len(word)
print(size)
Результат
6
len и print уже доступны при запуске. Здесь «системная функция» точнее называется встроенной; это не команда операционной системы.
Метод
Операция объекта или класса, которую обычно вызывают через точку: s.strip(). Она может вернуть новое значение или изменить сам объект — это нужно узнавать для каждого метода.
Модуль и библиотека
Модуль — отдельная единица кода, часто файл .py. Библиотека — набор готовых возможностей; она может состоять из одного модуля или нескольких пакетов и модулей. Например, math и itertools входят в стандартную библиотеку Python. Эти термины связаны, но не полностью равнозначны.
1. Подключить модуль целиком
Python 3
import math
print(math.isqrt(50))
Результат
7
Имя math обозначает модуль. Чтобы вызвать его функцию, пишем math.isqrt(...).
2. Импортировать нужную функцию
Python 3
from math import isqrt
print(isqrt(50))
Результат
7
В текущем пространстве имён появится isqrt, а не имя math.
3. Дать модулю короткое имя
Python 3
import math as m
print(m.isqrt(50))
Результат
7
Псевдоним m можно выбрать самостоятельно. Для большого проекта лучше сохранять привычные имена.
Как посмотреть содержимое модуля
Python 3
import math
print("isqrt" in dir(math))
print(math.isqrt.__name__)
Результат
True
isqrt
dir(math) возвращает список имён модуля; print(dir(math)) выведет его. help(math.isqrt) покажет справку по функции в среде, которая поддерживает такой вывод. Конструкция from math import * импортирует все публичные имена, но для учебных решений понятнее явно перечислять нужные функции.
Параметр и аргумент
В def square(x) имя x — параметр. В square(7) число 7 — аргумент. Аргументы передают по позиции либо по имени, например print(1, 2, sep=";").
Возвращаемое значение и побочный эффект
len(s) возвращает число. print(s) выводит текст и возвращает None. a.append(x) изменяет список и тоже возвращает None. Эти действия нельзя считать взаимозаменяемыми.
Python 3
from math import isqrt
s = " python "
print(len(s))
print(s.strip().upper())
print(isqrt(50))
Результат
10
PYTHON
7
СТАРТ / ДЕКОРАТОРЫ
Что означает @ над функцией
Где пригодится на ЕГЭ № 16, 19–21, 23 — кеширование повторяющихся рекурсивных вызовов, если выбран такой способ решения.
Декоратор — вызываемый объект, который получает функцию или класс и возвращает объект-замену. Он позволяет добавить поведение при определении. Для одной функции запись @announce над def hello эквивалентна последующему hello = announce(hello).
announce получает исходную функцию и возвращает wrapper. При вызове hello() обёртка печатает «Начало», затем вызывает сохранённую функцию. Само декорирование происходит при выполнении определения, а не только при первом вызове.
В подготовке к ЕГЭ часто полезен @lru_cache(None): он запоминает результаты повторяющихся вызовов рекурсивной функции. Это не новая команда языка, а декоратор из модуля functools. Его подробный пример находится в теме «Функции и рекурсия».
Не путай: @ в строке над def обозначает синтаксис декорирования. Между операндами @ также может означать матричное умножение, если их тип поддерживает такую операцию. Для начала подготовки создавать свои сложные декораторы необязательно.
СТАРТ / ОШИБКИ И ПЛАН ОБУЧЕНИЯ
Как читать ошибку и с чего начать
Где пригодится на ЕГЭ Любые программные решения, особенно № 16, 17, 24–27: поиск ошибок перед получением ответа.
Начни с последней строки сообщения: в ней тип ошибки и пояснение.
Найди строку своего файла в traceback. При SyntaxError проверь также предыдущую строку: там мог не хватить скобки или двоеточия.
Проверь типы и значения переменных через print(). Исправь причину и запусти программу заново.
SyntaxError / IndentationError
Неверная запись или отступы. Проверь двоеточия, скобки, кавычки и границы блоков.
NameError / TypeError
Не найдено имя либо операция не поддерживает переданные типы. Проверь опечатки и преобразования input().
ValueError / IndexError / KeyError
Неподходящее значение для преобразования, индекс за границей или отсутствующий ключ словаря.
ZeroDivisionError / EOFError / RecursionError
Нулевой делитель, недостаточно входных данных либо слишком глубокая рекурсия.
Маршрут для новичка: ввод и типы → арифметика → условия → циклы → строки и списки → файлы → функции → алгоритмические приёмы. Декораторы и оптимизации изучай после уверенного владения функциями.
Где пригодится на ЕГЭ № 2, 15 — логические выражения; № 17, 25, 26 — условия отбора данных.
Записывать ограничения и проверять варианты.
Команда / конструкция
Когда использовать
if condition:
pass
elif other_condition:
pass
else:
pass
Выполнить одну из ветвей программы.
==, !=, <, <=, >, >=
Операторы сравнения в Python. Меньше или равно записывается <=, больше или равно — >=; проверка равенства — ==. Пример цепочки: 10 <= x < 100.
and, or, not
Для булевых значений — И, ИЛИ, НЕ. and и or возвращают один из операндов и используют сокращённую проверку, а not всегда возвращает bool. Приоритет: not → and → or.
!=
Не равно: x != y. Записывается двумя отдельными символами: восклицательный знак и знак равенства.
(not A) or B
Импликация A → B для логических условий A и B. Не подменяй её числовым сравнением произвольных A и B.
Пример
for x in range(1, 11):
if x % 2 == 0 and x % 3 != 0:
print(x, end=" ")
Результат
2 4 8 10
Запомни: Не путай присваивание = и сравнение ==. Для сложных логических выражений явно ставь скобки. Побитовые & и | не заменяют and и or для произвольных значений.
Ещё пример: важные нюансы
Проверь поведение
print(3 != 5, 3 == 5)
print(0 or 7, 2 and 9)
A, B = True, False
print((not A) or B)
Результат
True False
7 9
False
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
==, !=, <, <=, >, >=: сравнения
Как записывается
x != y; 10 <= x < 100
Что делает
Для чисел и строк сравнения дают True или False. != — два символа: ! и =. Цепочка сравнений проверяет оба ограничения.
Когда применять
Отбирать числа по условиям. Сравнение == проверяет равенство значений, = выполняет присваивание.
Python 3
x = 12
print(x != 10)
print(10 <= x < 100)
print("10" < "2")
Результат
True
True
True
Частая ошибка: Строки сравниваются лексикографически. Не сравнивай числа из input() как строки, если требуется числовой порядок.
and возвращает первый ложный операнд либо последний; or — первый истинный либо последний. Оба используют сокращённое вычисление. not всегда возвращает bool.
Когда применять
Соединять ограничения и безопасно проверять выражения, например n != 0 and 10 % n == 0.
Python 3
print(0 or 7)
print(2 and 9)
print(not [])
n = 0
print(n != 0 and 10 % n == 0)
Результат
7
9
True
False
Частая ошибка: and и or не обязаны возвращать True или False. Приоритет: not, затем and, затем or; в сложном выражении ставь скобки.
if проверяет первое условие. Если оно истинно, выполняется его блок.
elif означает «иначе, если»: проверяется только тогда, когда все предыдущие условия ложны. Таких ветвей может быть несколько или ни одной.
else не содержит условия и выполняется, если ни одна предыдущая ветка не подошла. Эта ветка необязательна.
После выполнения одной ветви программа продолжает работу после всей конструкции. Остальные ветви этой цепочки не выполняются.
Общий шаблон
if condition:
action()
elif other_condition:
other_action()
else:
fallback_action()
В шаблоне используются условные имена: замени их своими условиями и действиями. После if и elif нужно выражение; после else его нет. В конце каждого заголовка ставится двоеточие, а тело записывается с отступом.
Пример: классифицировать число
Python 3
n = -4
if n > 0:
print("Положительное")
elif n == 0:
print("Ноль")
else:
print("Отрицательное")
print("Проверка завершена")
Хотя 95 удовлетворяет обоим неравенствам, выбирается только первая ветвь. Если сначала поставить score >= 70, оценка 95 попадёт туда, а ветка >= 90 не будет достигнута.
Два if и одна цепочка if/elif — разные конструкции
Python 3
n = 12
if n > 0:
print("Положительное")
if n % 2 == 0:
print("Чётное")
Результат
Положительное
Чётное
Здесь проверки независимы, поэтому выполняются обе. Если нужны взаимоисключающие варианты — используй if/elif/else. Для проверки диапазона удобно писать 10 <= n < 100.
Частые ошибки: забытое двоеточие, неверный отступ, else с условием, присваивание = вместо сравнения ==. Условия могут быть любыми выражениями: ноль и пустые коллекции считаются ложными.
04 / PYTHON
Циклы и перебор
Где пригодится на ЕГЭ № 5, 8, 14, 17, 24–27 — перебор вариантов и последовательная обработка данных.
Повторять действия, считать количество и сумму.
Команда / конструкция
Когда использовать
range(start, stop, step)
Диапазон целых чисел с ненулевым шагом; stop не включается. При положительном шаге идут, пока число < stop, при отрицательном — пока > stop. range(n) — от 0 до n − 1 при n > 0.
for x in a:
Перебор элементов последовательности.
while condition:
Повторять блок, пока условие истинно.
break
continue
Завершить ближайший охватывающий цикл / перейти к следующей его итерации. Во вложенных циклах break не выходит сразу из всех циклов.
enumerate(a)
Получать одновременно индекс и значение.
Пример
total = 0
for x in range(2, 11, 2):
total += x
print(total)
Результат
30
Запомни: В range шаг не может быть нулём. При обратном проходе используй отрицательный шаг. В while меняй данные, от которых зависит условие, чтобы избежать бесконечного цикла.
Где пригодится на ЕГЭ № 5, 14 — записи чисел; № 24 — фрагменты и свойства строк; № 25 — маски чисел.
Искать символы, выделять фрагменты и заменять подстроки.
Команда / конструкция
Когда использовать
s[i], s[-1]
Символ по индексу; −1 — последний. Индексация начинается с 0.
s[a:b:c]
Срез с ненулевым шагом c, граница b не включается. При c > 0 движение слева направо, при c < 0 — справа налево. Пропущенные границы зависят от знака шага.
len(s), s.count(t), s.find(t)
Длина; число непересекающихся вхождений; индекс первого вхождения или −1.
s.replace(a, b)
Новая строка с заменой всех вхождений a на b.
s.strip(), s.split(), "".join(a)
strip() убирает пробельные символы по краям. split() без аргумента делит по сериям пробельных символов. join(a) соединяет только строки; числа сначала преобразуй в str.
s.startswith(t), s.endswith(t)
Проверка начала и конца строки. Возвращают True или False.
Пример
s = "0123456789"
print(s[1:8:2])
print(s[::-1])
Результат
1357
9876543210
Запомни: Строка неизменяема: результат replace() нужно присвоить. count() не считает перекрывающиеся вхождения. strip("abc") удаляет любые символы a, b, c с краёв, а не целую подстроку.
Ещё пример: важные нюансы
Проверь поведение
s = "ABCDE"
print(s[4:0:-2])
print("aaaa".count("aa"))
print(" a b ".split())
Результат
EC
2
['a', 'b']
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
Индексы и срезы
1. Индекс выбирает один элемент
Индексы начинаются с нуля. Отрицательные считаются с конца: -1 — последний элемент, -2 — предпоследний. Для строки s = "ABCDE":
Символ
A
B
C
D
E
Индекс слева
0
1
2
3
4
Индекс с конца
-5
-4
-3
-2
-1
2. Срез: начало, конец и шаг
s[start:stop:step]
start — позиция, с которой начинаем; она включается.
stop — граница, до которой идём; она не включается.
step — ненулевой шаг. Положительный идёт вправо, отрицательный — влево.
Python 3
s = "ABCDE"
print(s[1:4])
print(s[::2])
print(s[-3:])
print(s[:-1])
Результат
BCD
ACE
CDE
ABCD
3. Пропущенные границы
При положительном шаге пропущенное начало — первый элемент, конец — граница после последнего. При отрицательном шаге начало — последний элемент, конец — граница перед первым. Поэтому s[:] копирует последовательность, а s[::-1] разворачивает её.
Python 3
s = "ABCDE"
print(s[4:0:-2])
print(s[::-1])
print(repr(s[4:-1:-1]))
print(s[4::-1])
Результат
EC
EDCBA
''
EDCBA
В s[4:-1:-1] явный индекс -1 означает последний элемент, то есть ту же позицию 4. Начало совпало с исключённой границей — срез пустой. Пропущенная граница в s[4::-1] означает движение до начала строки и не равна явному -1.
4. Направление и выход за границы
Python 3
s = "ABCDE"
print(repr(s[4:1]))
print(s[1:99])
print(repr(s[99:]))
Результат
''
BCDE
''
В первом случае шаг по умолчанию +1, но начало правее конца, поэтому элементов нет. Срезы обрезают слишком большие границы, тогда как отдельный индекс s[99] вызовет IndexError.
5. Те же правила работают для списков
Python 3
a = [10, 20, 30, 40, 50]
print(a[1:4:2])
print(a[::-1])
print(a)
Срез списка создаёт поверхностную копию: сам внешний список новый, но вложенные изменяемые объекты могут остаться общими. Срез строки создаёт значение строки; исходная последовательность не меняется.
Запомни: правая граница не включается; нулевой шаг вызывает ValueError; отрицательный индекс и отрицательный шаг — разные вещи.
find() и count(): поиск подстрок
Как записывается
s.find(part); s.count(part)
Что делает
find возвращает индекс первого вхождения или -1; count — число неперекрывающихся вхождений. Исходная строка не меняется.
Когда применять
Найти позицию разделителя или посчитать отдельные вхождения фрагмента.
Python 3
s = "ababa"
print(s.find("ba"))
print(s.find("x"))
print(s.count("aba"))
print(sum(s[i:i+3] == "aba" for i in range(len(s)-2)))
Результат
1
-1
1
2
Частая ошибка: Для перекрывающихся вхождений count недостаточно. Не проверяй find через if s.find(...): индекс 0 ложен, а -1 истинен.
Где пригодится на ЕГЭ № 17 — числовые последовательности; № 26 — сортировка; № 27 — хранение и обработка данных.
Хранить последовательности чисел и искать нужные элементы.
Команда / конструкция
Когда использовать
list(iterable), [int(x) for x in s.split()]
Создание списка; списковое включение с преобразованием.
a.append(x), a.pop()
append(x) добавляет один объект в конец. pop() удаляет и возвращает последний элемент; для пустого списка вызывает IndexError.
sum(a), min(a), max(a), len(a)
Сумма, минимум, максимум, длина. sum([]) даёт 0; min([]) и max([]) без default вызывают ValueError.
sorted(a), sorted(a, reverse=True)
Новый отсортированный список по возрастанию / убыванию.
sorted(a, key=lambda x: x[1])
Сортировка записей по второму полю.
Пример
a = [7, 2, 9, 4]
b = sorted(a)
print(b)
print(sum(b[-2:]))
Результат
[2, 4, 7, 9]
16
Запомни: a.sort() изменяет список и возвращает None. Для копии используй a.copy() или a[:]; b = a создаёт вторую ссылку на тот же список. Не удаляй элементы из списка во время прямого перебора по нему. Копия через a[:] поверхностная: вложенные списки остаются общими. Строки сортируются лексикографически: "10" меньше "2"; для чисел преобразуй тип.
Ещё пример: важные нюансы
Проверь поведение
a = [3, 1, 2]
result = a.sort()
print(a, result)
print(sorted(["2", "10"]))
Результат
[1, 2, 3] None
['10', '2']
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
Списковое включение: создать и отобрать
Как записывается
[expression for x in iterable if condition]
Что делает
Создаёт новый список, вычисляя expression для элементов, прошедших необязательное условие.
Когда применять
Собрать квадраты чётных чисел или преобразовать ввод.
Python 3
a = [1, 2, 3, 4, 5]
squares = [x * x for x in a if x % 2 == 0]
print(squares)
print(a)
Результат
[4, 16]
[1, 2, 3, 4, 5]
Частая ошибка: Для длинной или сложной логики обычный for читается лучше. Включение создаёт список целиком, что требует памяти.
Где пригодится на ЕГЭ № 17, 24, 26, 27 — чтение файлов с последовательностями, строками и наборами данных.
Обрабатывать числовые данные и длинные строки.
Команда / конструкция
Когда использовать
with open("data.txt") as f:
Открыть текстовый файл на чтение и закрыть после блока. При необходимости укажи encoding="utf-8".
for line in f:
Построчное чтение, удобно для больших файлов.
f.readline()
Читает одну строку, обычно сохраняя \n в конце. На конце файла вернёт "", а пустая строка в файле обычно читается как "\n".
f.read().split()
Все данные, разбитые по пробельным символам. Требует памяти под весь файл.
Пример
from io import StringIO
# Имитируем файл с числами
with StringIO("12\n7\n5\n") as f:
a = [int(line) for line in f]
print(sum(a))
Результат
24
Запомни: Пример использует StringIO вместо реального файла. В задаче замени его на open("имя_файла.txt"). Уточняй формат: первая строка может содержать количество чисел. Чтение всего файла целиком может не подойти для большого объёма данных. Файл — одноразовый проход: после read() чтение продолжится с текущей позиции; для возврата к началу используй f.seek(0).
Ещё пример: важные нюансы
Проверь поведение
from io import StringIO
f = StringIO("\n")
print(repr(f.readline()))
print(repr(f.readline()))
Результат
'\n'
''
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
open() и with: работа с файлом
Отдельная инструкция: как прочитать файл задачи
Подготовь текстовый файл. Например, создай data.txt, в котором каждое число записано на отдельной строке.
На компьютере помести его в рабочую папку запуска программы или укажи полный путь. Относительный путь отсчитывается от текущей рабочей папки, которая не всегда совпадает с папкой файла .py.
В нашем онлайн Python загрузи файл в поле «Файл UTF-8 для задачи» и используй его точное имя в open().
Открой файл через with open(...), прочитай данные в блоке с отступом. После блока файл закроется автоматически.
Файл data.txt для следующего примера
12
7
5
Прочитать и сложить числа
Python 3
with open("data.txt", "r", encoding="utf-8") as f:
total = 0
for line in f:
total += int(line)
print(total)
Результат
24
Этот пример требует подготовленного data.txt с содержимым выше. int() допускает пробелы и перевод строки по краям числовой записи. Пустую строку вместо числа нужно отдельно пропустить или обработать согласно формату файла.
Что означают аргументы open()
Аргумент
Значение
"data.txt"
Путь к файлу; это строка, поэтому нужны кавычки.
"r"
Чтение, режим по умолчанию. Файл должен существовать.
"w"
Запись: создаёт файл или стирает прежнее содержимое.
"a"
Добавление данных в конец; создаёт файл, если его нет.
encoding="utf-8"
Кодировка текстового файла. Должна соответствовать тому, как файл сохранён.
as f
Имя файлового объекта внутри блока with; f можно заменить другим именем.
Файл с количеством чисел в первой строке
Если первая строка — число записей, её нельзя прибавлять к данным. Для примера ниже файл numbers.txt содержит строки 3, 12, 7, 5.
Python 3
with open("numbers.txt", encoding="utf-8") as f:
n = int(f.readline())
a = [int(f.readline()) for _ in range(n)]
print(n, sum(a))
Результат
3 24
Создание учебного файла и повторное чтение
Python 3
with open("sample.txt", "w", encoding="utf-8") as f:
f.write("4\n6\n")
with open("sample.txt", encoding="utf-8") as f:
print(sum(int(line) for line in f))
Результат
10
Проверь при ошибке: FileNotFoundError — путь или имя файла; UnicodeDecodeError — кодировку; ValueError — формат строки. Не открывай входной файл в режиме w: его данные будут стёрты. Обычный текстовый open() не превращает таблицы .xlsx/.ods в строки данных.
read(), readline() и позиция чтения
Как записывается
f.read(); f.readline(); f.seek(0)
Что делает
read читает оставшееся содержимое; readline — одну строку, обычно с переводом строки. Оба продвигают позицию чтения. На конце файла возвращают пустую строку.
Когда применять
Прочитать длинную строку целиком либо сначала заголовок, затем данные.
Python 3
from io import StringIO
f = StringIO("A\n\nB")
print(repr(f.readline()))
print(repr(f.readline()))
print(repr(f.read()))
print(repr(f.read()))
Результат
'A\n'
'\n'
'B'
''
Частая ошибка: Пустая строка внутри файла читается как "\n", а конец файла — как "". После полного прохода для повторного чтения нужен seek(0) либо повторное открытие.
Где пригодится на ЕГЭ № 16 — рекуррентные выражения; № 19–21 — игры; № 23 — подсчёт программ исполнителя.
Описывать повторяющиеся вычисления и зависимости.
Команда / конструкция
Когда использовать
def f(x):
Объявление функции с параметром.
return value
Возврат результата и завершение вызова функции.
from functools import lru_cache
Импорт кеширования результатов функции.
@lru_cache(None)
Кешировать результаты по аргументам без ограничения числа записей; это может расходовать много памяти.
Пример
from functools import lru_cache
@lru_cache(None)
def f(n):
if n <= 1:
return 1
return n + f(n - 2)
print(f(7))
Результат
16
Запомни: Обязательно задай базовый случай. Кеширование не убирает ограничение глубины рекурсии: для длинных цепочек часто лучше цикл и таблица. Аргументы кешируемой функции должны быть хешируемыми. Без return функция возвращает None. Не меняй внешние данные, от которых зависит результат кешируемой функции, без очистки кеша.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
def и return: создать функцию
Как записывается
def name(parameter):
return expression
Что делает
def создаёт функцию. Параметр — имя в определении, аргумент — переданное значение. return возвращает результат и немедленно завершает текущий вызов.
Когда применять
Выделить проверку числа или повторяющееся вычисление.
Python 3
def square(x):
return x * x
answer = square(7)
print(answer)
Результат
49
Частая ошибка: print внутри функции не заменяет return. Если return не выполнен либо записан без значения, результат вызова — None.
from functools import lru_cache
@lru_cache(None)
def f(n):
...
Что делает
Декоратор кеширует результаты по аргументам. None отключает ограничение размера кеша. Повторный вызов с теми же аргументами может вернуть готовый результат.
Когда применять
Ускорить рекурсию, где одни и те же подзадачи вычисляются многократно.
Python 3
from functools import lru_cache
@lru_cache(None)
def f(n):
if n < 2:
return n
return f(n - 1) + f(n - 2)
print(f(10))
print(f(10))
Результат
55
55
Частая ошибка: Аргументы должны быть хешируемыми. Кеш не снимает ограничение глубины рекурсии и расходует память. Используй его для функций без значимых побочных эффектов.
Где пригодится на ЕГЭ № 5, 14 — перевод и изменение записи числа; № 13 — анализ двоичной записи IP-адресов.
Преобразовывать записи и анализировать цифры.
Команда / конструкция
Когда использовать
bin(n), oct(n), hex(n)
Запись целого числа в основаниях 2, 8 и 16, с префиксом.
bin(n)[2:]
Для неотрицательного n: двоичная запись без 0b.
int(s, base)
Разобрать целое число из строки в основании 2–36 (также есть режим base=0 для префиксов 0b, 0o, 0x). Цифры должны подходить основанию.
n % base, n // base
Для целого n ≥ 0 и целого base ≥ 2: последняя цифра в основании base и удаление этой цифры. Для отрицательных чисел сначала обработай знак.
Пример
n = 45
s = bin(n)[2:]
print(s)
print(s.count("1"))
print(int("101101", 2))
Результат
101101
4
45
Запомни: Срез [2:] подходит для неотрицательных чисел; у отрицательных bin() начинается с −0b. Для основания больше 36 реализуй преобразование самостоятельно. Ноль в своей функции преобразования обработай отдельно.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
bin() и int(..., base): преобразовать запись
Как записывается
bin(n); int(text, base)
Что делает
bin возвращает строку с префиксом 0b для неотрицательного числа. int(text, base) читает целое в основании 2–36; режим 0 распознаёт префиксы.
Когда применять
Дописывать разряды, считать единицы и переводить числа.
Python 3
s = bin(45)[2:]
print(s, s.count("1"))
print(int("101101", 2))
print(int("FF", 16))
Результат
101101 4
45
255
Частая ошибка: У отрицательных чисел префикс начинается с -0b, поэтому [2:] не удалит его правильно. Для анализа модуля используй abs(n).
Свой алгоритм перевода в произвольную систему счисления
Идея: деление с остатком
Последняя цифра в основании base равна x % base.
Убираем эту цифру: x //= base.
Повторяем, пока x не станет нулём.
Остатки получаются от младшей цифры к старшей, поэтому добавляем их слева или разворачиваем список.
Ваш пример: перевод в троичную систему
Python 3
def f(x):
if x == 0:
return "0"
s = ""
while x != 0:
s = str(x % 3) + s
x //= 3
return s
print(f(9**8 + 3**5 - 9).count("2"))
Результат
3
Здесь x должен быть неотрицательным целым. Проверка x == 0 нужна, чтобы число 0 не превращалось в пустую строку. Выражение count("2") считает двойки уже в полученной троичной записи.
Универсальная запись для оснований от 2 до 36
Python 3
def to_base(x, base):
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if not 2 <= base <= len(alphabet):
raise ValueError("Основание должно быть от 2 до 36")
if x == 0:
return "0"
sign = "-" if x < 0 else ""
x = abs(x)
s = ""
while x:
s = alphabet[x % base] + s
x //= base
return sign + s
print(to_base(45, 2))
print(to_base(255, 16))
print(to_base(0, 7))
print(to_base(-45, 3))
Результат
101101
FF
0
-1200
Функция принимает целое x и целое основание base. Для разрядов от 10 используются буквы: A = 10, B = 11, …, Z = 35. Поэтому нельзя просто писать str(x % base) при base > 10: число 15 должно стать одной цифрой F, а не двумя символами 1 и 5.
Для любого целого основания от 2: список цифр
Python 3
def base_digits(x, base):
if x < 0 or base < 2:
raise ValueError("Нужны x >= 0 и base >= 2")
if x == 0:
return [0]
digits = []
while x:
digits.append(x % base)
x //= base
return digits[::-1]
print(base_digits(2026, 100))
print(base_digits(45, 3))
Результат
[20, 26]
[1, 2, 0, 0]
Эта версия принимает целые x >= 0 и base >= 2. Она не ограничена алфавитом: каждая цифра хранится отдельным числом от 0 до base-1. Например, [20, 26] в основании 100 означает 20*100 + 26. Это список разрядов, а не неоднозначная склеенная строка.
Важно: отдельно обработай ноль, знак и допустимое основание. Цикл while x != 0 с отрицательным x без abs() может не завершиться из-за округления // вниз.
11 / PYTHON
Комбинаторный перебор
Где пригодится на ЕГЭ № 8 — комбинаторный подсчёт и слова; № 2 — перебор логических наборов; № 15 — проверка ограничений.
Строить слова и сочетания по заданным правилам.
Команда / конструкция
Когда использовать
from itertools import product, permutations, combinations
Подключение трёх функций из стандартного модуля itertools.
product("AB", repeat=3)
Все слова длины 3 с повторениями.
permutations(a, r)
Все порядки r выбранных элементов. Одна позиция не берётся дважды; AB и BA — разные варианты.
combinations(a, r)
Выбор r позиций без учёта перестановок. Из A, B, C при r=2 получатся AB, AC, BC.
Пример
from itertools import product
count = 0
for word in product("AB", repeat=3):
if word.count("A") == 2:
count += 1
print(count)
Результат
3
Запомни: product() возвращает кортежи. Для строки используй "".join(word). Число вариантов растёт экспоненциально: не превращай большой перебор в list(). Повторяющиеся значения во входном наборе могут давать одинаковые результаты в permutations().
Ещё пример: важные нюансы
Проверь поведение
from itertools import combinations
print(list(combinations("AAB", 2)))
Результат
[('A', 'A'), ('A', 'B'), ('A', 'B')]
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
product(): перебор с повторениями
Как записывается
product(alphabet, repeat=length)
Что делает
Возвращает итератор кортежей — декартово произведение. При repeat=k перебираются слова длины k; исходные символы могут повторяться.
При алфавите "AB" и длине 2 возможны AA, AB, BA, BB: порядок важен и символы можно использовать многократно. Для m различных символов и длины k вариантов m**k. Порядок выдачи определяется порядком символов во входе: если алфавит отсортирован, слова идут в соответствующем лексикографическом порядке.
Когда применять
Перебрать слова или логические наборы.
Python 3
from itertools import product
for word in product("AB", repeat=2):
print("".join(word))
Результат
AA
AB
BA
BB
Частая ошибка: Результат — кортеж, не строка. При алфавите размера m число вариантов равно m**k: оцени объём перебора заранее.
permutations(): порядок важен, позиции не повторяются
permutations выбирает r различных позиций исходной последовательности и перебирает все порядки выбранных элементов. Если r не указано, берутся все элементы. Для n различных элементов количество результатов — n! / (n-r)!.
Python 3
from itertools import permutations
for word in permutations("ABC", 2):
print("".join(word))
Результат
AB
AC
BA
BC
CA
CB
AB и BA считаются разными. Буква с одной и той же позиции не используется дважды. При одинаковых буквах на разных позициях одинаковые результаты всё равно возможны.
combinations(): порядок выбора не важен
combinations выбирает r различных позиций без перебора перестановок одного и того же выбора. Внутри результата элементы идут в порядке их позиций во входных данных. Для n различных элементов число вариантов — n! / (r!*(n-r)!).
Python 3
from itertools import combinations
for pair in combinations("ABC", 2):
print("".join(pair))
Результат
AB
AC
BC
Из пары букв A и B получится AB, а отдельного варианта BA не будет. Если исходный набор не отсортирован, combinations не сортирует значения самостоятельно.
combinations_with_replacement(): выбор с повторениями
combinations_with_replacement выбирает r элементов с возможностью повторного использования позиции. Порядок выбора не различается. Подходит, например, для выбора двух вкусов, когда одинаковый вкус разрешён.
Python 3
from itertools import combinations_with_replacement
for pair in combinations_with_replacement("AB", 2):
print("".join(pair))
Результат
AA
AB
BB
В отличие от product("AB", repeat=2), отдельного BA здесь нет. Для n различных элементов и длины r число вариантов равно C(n+r-1, r).
Какую функцию выбрать
Функция
Порядок важен?
Повтор позиции?
Для A, B и длины 2
product
Да
Да
AA, AB, BA, BB
permutations
Да
Нет
AB, BA
combinations
Нет
Нет
AB
combinations_with_replacement
Нет
Да
AA, AB, BB
Все эти функции возвращают итераторы кортежей. Для строки используй "".join(...). Не превращай большой перебор в список без необходимости; при повторяющихся входных значениях могут появляться одинаковые результаты.
12 / PYTHON
Полезные функции
Где пригодится на ЕГЭ № 15 — all/any для логических проверок; № 17 — суммы и экстремумы; № 25 — делители, НОД и целый квадратный корень.
Проверять делители и условия для последовательностей.
Команда / конструкция
Когда использовать
all(iterable), any(iterable)
Все условия истинны / хотя бы одно условие истинно.
zip(a, b)
Пары соответствующих элементов; по умолчанию до конца короткой последовательности.
from math import isqrt, gcd, ceil
isqrt(n) = ⌊√n⌋ для целого n ≥ 0; gcd(a, b) — неотрицательный НОД целых; ceil(x) — округление вверх.
range(1, isqrt(n) + 1)
Кандидаты в делители до корня включительно.
Пример
from math import isqrt
n = 36
divisors = set()
for d in range(1, isqrt(n) + 1):
if n % d == 0:
divisors.add(d)
divisors.add(n // d)
print(sorted(divisors))
Результат
[1, 2, 3, 4, 6, 9, 12, 18, 36]
Запомни: При поиске делителей учитывай парный делитель n // d. Для квадратов два делителя совпадают — множество уберёт дубль. all([]) возвращает True, any([]) — False. Пример с делителями рассчитан на целое n > 0. Для больших целых не заменяй isqrt(n) на int(n ** 0.5): округление float может дать ошибку.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
all() и any(): проверить много условий
Как записывается
all(iterable); any(iterable)
Что делает
all истинен, если все элементы истинны; any — если хотя бы один истинен. Обе функции прекращают чтение, когда результат уже определён.
Когда применять
Проверить отсутствие делителей или наличие подходящей пары.
Python 3
print(all(x > 0 for x in [2, 7, 1]))
print(any(x % 2 == 0 for x in [3, 5, 8]))
print(all([]), any([]))
Результат
True
True
True False
Частая ошибка: Пустой перебор делает all истинным, а any ложным. Убедись, что диапазон проверки не оказался пустым случайно.
Частая ошибка: Без default min([]) и max([]) вызовут ValueError. Стартовое значение 0 не подходит для максимума отрицательных чисел, если ты считаешь максимум вручную.
Где пригодится на ЕГЭ № 25 — отбор чисел по маске записи с дополнительными арифметическими условиями.
Отбирать десятичные записи по шаблону.
Команда / конструкция
Когда использовать
from fnmatch import fnmatchcase
Импорт проверки строки по шаблону с учётом регистра.
fnmatchcase(s, "12?*5")
Сопоставление всей строки с шаблоном.
"?"
Ровно один произвольный символ; для строки из цифр — одна цифра.
"*"
Любая последовательность символов, в том числе пустая.
Пример
from fnmatch import fnmatchcase
for n in [125, 1205, 12345, 129]:
if fnmatchcase(str(n), "12?*5"):
print(n)
Результат
1205
12345
Запомни: Это не регулярные выражения. Маска проверяет символы, а не арифметические свойства. Применяй её к str(n); делимость проверяй отдельно. Если ищешь числа, кратные d > 0, перебирай с шагом d, а не все числа подряд.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
fnmatchcase(): проверить маску
Как записывается
fnmatchcase(text, pattern)
Что делает
Сопоставляет всю строку с шаблоном: ? — ровно один символ, * — любая последовательность, включая пустую. Регистр учитывается.
Когда применять
Отбирать десятичные записи чисел по маске.
Python 3
from fnmatch import fnmatchcase
for n in [125, 1205, 12345]:
print(n, fnmatchcase(str(n), "12?*5"))
Результат
125 False
1205 True
12345 True
Частая ошибка: Шаблоны fnmatch не равны регулярным выражениям. На строке из цифр ? соответствует цифре, но вообще это любой символ.
Где пригодится на ЕГЭ № 17 — соседние пары и последовательности; префиксы полезны в тренировочных задачах с повторными запросами сумм отрезков.
Основные приёмы для числовых последовательностей.
Команда / конструкция
Когда использовать
zip(a, a[1:])
Соседние пары списка; создаётся копия среза a[1:].
range(len(a) - 1)
Индексы начал соседних пар: a[i], a[i + 1].
prefix = [0]
Начало таблицы префиксных сумм: prefix[i] — сумма первых i элементов.
prefix[r] - prefix[l]
Сумма элементов a[l:r], граница r не включается.
Пример
a = [3, -2, 5, 4]
prefix = [0]
for x in a:
prefix.append(prefix[-1] + x)
print(prefix[3] - prefix[1])
print(sum(x < y for x, y in zip(a, a[1:])))
Результат
3
1
Запомни: Соседние пары и любые пары — разные задачи. Для любых пар i < j наивный двойной цикл имеет квадратичную сложность. Префиксы ускоряют суммы отрезков, но не решают автоматически поиск лучшего отрезка.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
Префиксные суммы: сумма отрезка
Как записывается
prefix[r] - prefix[l]
Что делает
prefix[i] хранит сумму первых i элементов. Разность двух префиксов даёт сумму a[l:r], где правая граница не включается.
Когда применять
Много раз быстро считать суммы разных отрезков: подготовка O(n), один запрос O(1).
Python 3
a = [3, -2, 5, 4]
prefix = [0]
for x in a:
prefix.append(prefix[-1] + x)
print(prefix[3] - prefix[1])
Результат
3
Частая ошибка: prefix начинается с нуля и имеет длину len(a)+1. Для включительного отрезка с индексами l..r нужна формула prefix[r+1]-prefix[l].
Запомни: Counter хранит частоты, а len(counts) — число ключей, не сумму частот. После изменения счётчика в нём могут остаться ключи с нулевой или отрицательной частотой.
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
Counter(): частоты элементов
Как записывается
from collections import Counter
counts = Counter(data)
Что делает
Словарь-подобный объект счётчиков. Для отсутствующего ключа возвращает 0; most_common(k) выдаёт до k самых частых значений с частотами.
Когда применять
Подсчитать символы или повторы чисел.
Python 3
from collections import Counter
c = Counter("ABACABA")
print(c["A"], c["Z"])
print(c.most_common(1))
print(sum(c.values()))
Результат
4 0
[('A', 4)]
7
Частая ошибка: len(c) — количество ключей, не сумма частот. В счётчике после изменений могут остаться нулевые и отрицательные частоты.
Запомни: Десятичные дроби часто хранятся в float приближённо. Для точных расчётов с целыми предпочитай целочисленные формулы. round() не всегда совпадает со школьным правилом «5 округляется вверх».
Подробно: отдельные команды и операции
Открой нужный разбор. Каждый пример можно выполнить целиком.
round(): округление и float
Как записывается
round(x); round(x, ndigits)
Что делает
Округляет к ближайшему значению; при точной середине выбирается чётное. Десятичные дроби типа float часто представлены приближённо.
Когда применять
Округлить вывод, когда это разрешено условием; для точных целочисленных задач лучше не вводить float без необходимости.