Python на компьютерном ЕГЭ: мифы и реальность

Наступил новый учебный год и будущие выпускники перешли к интенсивной фазе подготовки к компьютерному ЕГЭ. Для тех выпускников, которые не изучали должным образом программирование ранее, возникает вопрос выбора языковых средств. На КЕГЭ-2021 большое количество выпускников выбрали python. Но оправдан ли был этот выбор? На мой взгляд, причиной популярности в выборе python – это сложившиеся устойчивые мифы, которыми неизбежно обрастает любая современная технология. Я не разрушитель мифов, но факты – вещь упрямая! Опровергнем эти мифы сравнивая python с компилируемыми языками. Эта информация будет полезна для тех, кто только приступил к подготовке и не знает правильный ли он сделал выбор. Итак, существуют два расхожих мифа.
Миф первый: На Python можно быстро научиться программировать
Обучение языку программирования начинается со стандартных средств. Стандартные языковые средства, такие как типы данных, литералы, переменные, инструкции управления и прочее, являются общими единицами синтаксиса для всех языков, которые допускаются к использованию на КЕГЭ. То, что, например, в python существуют только две разновидности циклов, а сами циклы содержат необязательный блок else – не наделяют этот язык неким преимуществом, скорее наоборот. Только в некоторых задачах дополнительный блок else может украсить или упростить код, но, в большинстве случаев, его можно просто проигнорировать. Цикл for python, строго говоря, предназначен для обхода коллекций и не является универсальным, по сравнению с аналогичным циклом в C++. В месте с тем, диапазонный цикл for в C++ выполняет те же задачи, что и цикл for в python. Эти малозначимые разночтения синтаксиса языков не имеют большого значения для решения экзаменационных задач.
Отдельно отмечу, что, помимо синтаксиса и семантики языка, важны знания классических алгоритмов и приемы программирования, которые не зависят от выбранного языка и без которых изучение языка выливается в пустую трату времени.
Заключительным этапом освоения языка является знакомство со структурами данных, строками и файлами. Сложность и продолжительность изучения этих тем определяется исключительно уровнем преподавания. На уровне школьной программы они будут одинаково сложны для всех языков. “Стандартный массив” – это “больное место” python. Им является очень медленный динамический массив List, который может хранить разнотипные элементы. Здесь python существенно проигрывает компилируемым языкам в которых реализованы как статические, так и динамические массивы высокой производительности. Напомню, что с массивами на КЕГЭ несколько задач. Быстрый массив реализован в модуле array, но его реализация настолько неудачна, что о нем в школьном курсе вообще не упоминается. (Возможным решением этой проблемы могло бы быть использование сторонней библиотеки numpy с эффективно работающим массивом, но статус этой библиотеки не ясен, т. к. она не входит в стандартную поставку python).
Помимо стандартного массива, необходимо познакомиться с реализацией абстрактных структур данных (см. здесь). Стандартными реализациями структур данных в python являются изменяемые последовательности list, set и dict. Дек вынесен в отдельный модуль, но функционально мало чем отличается от list. Остальные структуры данных создаются на основе имеющихся. Отсюда следствие – скорость их работы будет сравнима с List. Есть вариант использовать неизменяемые последовательности tuple и frozenset, которые могут ускорить работу программы, но только в тех задачах, где работа осуществляется в статическом массиве. Общее же количество реализаций структур данных имеющихся в python существенно уступает набору контейнеров в STD C++, которые разработаны практически под любые задачи. Временные затраты на изучение структур данных в различных языках будут приблизительно одинаковы. Но так или иначе, выпускник должен в худшем случае знать об их существовании, а в идеале – применять их на практике.
Строка в python – это неизменяемый объект. Сделано так для того, чтобы ускорить работу программ (основное назначение python – это работа со строкой в любом ее проявлении), а не для того, чтобы упростить работу программиста. Чтобы изменить строку необходимо создавать объект заново. Конечно, манипуляции со строкой можно формулировать очень кратко с использованием синтаксиса срезов, большого количества строковых функций или регулярных выражений (если подключить соответствующий модуль). Это – “плюс”, но эффективность работы такой программы весьма сомнительна (см., например, программу 9.7.14). Для сравнения, в C++ string (контейнер строковых объектов) – это динамический массив. Если разумно действовать с таким массивом, то можно добиться значительно более высокой эффективности, чем в работе со строкой в python. Набор стандартных задач со строками – общий, а функции для их решения разработаны во всех языках. Поскольку на экзаменах представлена однобайтовая строка (только латинские символы), возможности python по работе с Unicode-строкой нивелированы. Таким образом, и этот учебный раздел сводится к изучению стандартных функций и операций, а также классических алгоритмов обработки строки с равными временными затратами на обучение.
Аналогично мы можем утверждать, что изучение работы с текстовыми файлами тоже займет приблизительно равное время. А вот то, что действительно сильно отличает Python от того же C++ или Pascal (например, форматированный вывод, целое число произвольной точности, объектно-ориентированный подход, особенности работы с модулями и мн. др.) на экзамене вообще не затрагивается. Во всяком случае, эти вещи можно оставить “на потом”.
Вывод. Научиться быстро программировать на python (в процедурном стиле) конечно можно. Но, в рамках школьного курса, время на освоение python будет потрачено равно столько же, сколько и на изучение компилируемых языков. Умение быстро составлять эффективно работающий код – это уже мастерство и на это требуется много времени, вне зависимости от выбранного языка!
Миф второй: Программный код на Python очень компактный
Как и любой язык, python имеет свой самобытный синтаксис и набор ключевых слов. Объем ключевых слов меньше, чем в языках C++ или Pascal. Но в python используется большой набор стандартных функций (они реализованы в классах). Имена этих функций заимствовать не рекомендуется (но не запрещено). Реализация специфических задач вынесена в отдельные модули (например math), которые имеют собственные имена. В результате сложная программа, использующая различные модули, содержит огромный список зарезервированных имен.
Внешне программа выглядит компактно, в первую очередь из-за динамической типизации (отсутствуют разделы описания типов) и использования отступов в качестве операторных скобок. Последнее повышает читаемость программы. Дополнительно компактности кодированию добавляет функциональный стиль программирования. Средств функционального программирования в python более чем достаточно. Но с данным стилем программирования в школьном курсе ученики не знакомятся (или изучают его самостоятельно), поэтому вряд ли он будет доминировать на экзамене. Это значит, что программы, в основном, будут составляться в процедурном стиле. В таком случае, объем программного кода (в сложной программе) будет не сильно отличаться от соответствующего объема кода, скажем, в C++, который, кстати, имеет свою реализацию функционального программирования.
Вывод. Писать компактный программный код и использовать для этого все возможности python можно, но это не главное. На экзамене важно не умение писать компактный код, а умение составлять эффективно работающий алгоритм.
Реальность: Низкая скорость работы программ
А вот тесты скорости работы программ написанных на python “с треском провалены” по сравнению с компилируемыми языками. Это является следствием интерпретируемости программ языка. Оптимизация алгоритмов – это то, над чем нужно будет постоянно думать выпускнику при их составлении. Даже не оптимальный код на C++ работает несопоставимо быстрее, чем аналогичный код на python (доли секунды – против нескольких минут!).
Обилие готовых решений в виде функций (как стандартных, так и входящих в различные модули) вызывает соблазн применять их всюду и бездумно. Но это прямой путь к снижению производительности. Python предлагает массу путей решения одной и той же задачи, но эффективность выбранного варианта не всегда очевидна, а использовать время экзамена для экспериментов – не самая удачная мысль. В любом случае, злоупотреблять языковыми возможностями не стоит!
Вывод. Я не против python на экзамене, но и не за. Выбор за выпускником. На python можно составить быстро работающую программу и для сложного алгоритма, но нужно хорошо знать тонкости языка (за несколько месяцев до экзамена это вряд ли возможно достичь), отлично владеть математикой, применять математические “хитрости” для решения отдельных задач. Тем не менее, эффективность работы программы на python будет, в любом случае, существенно уступать эффективности работы аналогичной программы написанной на C++ или Pascal.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
ЕГЭ Информатика 2024 — Весь Python Для ЕГЭ
Детальный разбор ВСЕЙ базы знаний языка программирования Python 3, которая действительно НУЖНА для сдачи экзамена! В курсе есть ВСЯ основная теория, которая обязательна к изучению при подготовке к ЕГЭ по информатике.
Начальный уровень
1-2 часа в неделю

2 314 учащихся
Чему вы научитесь
- Научитесь мыслить логически и нестандартно
- Изучите все необходимые основы Python 3 для ЕГЭ
- Познакомитесь со многими функциями Python 3
- Узнаете о некоторых особенностях этого ЯП
- Примените полученные знания на практике
- Облегчите себе дальнейшую подготовку к экзамену, изучив важные азы ЯП
О курсе
Видеокурс по ВСЕЙ теории Python 3 — это полноценный курс, в котором разобрана вся база знаний языка программирования Python 3, необходимая для решения задач из ЕГЭ по информатике, с ПОЛНОГО НУЛЯ! Каждая тема будет понятна даже НОВИЧКУ, ведь обучение включает в себя :
- ТЕОРИЮ по Python 3, необходимую для сдачи экзамена
- КОНТРОЛЬНЫЕ ВОПРОСЫ, чтобы вы смогли оценить уровень своих знаний
- ПРАКТИКУ, чтобы вы закрепили полученные знания и навыки
- ДОМАШНЕЕ ЗАДАНИЕ с разбором всех особенностей
- ПОДДЕРЖКУ от преподавателя и единомышленников
- КОНСПЕКТ, который позволит легко повторить материал
- СОВЕТЫ о том, как и где «углубить» свои знания о Python 3
Не стесняйтесь задавать любые вопросы в комментариях к курсу или же в нашей Беседе в VK :
✅ Пройдя курс, вы изучите ВСЮ базовую теорию знаний, необходимую для решения КИМа ЕГЭ по информатике, в том числе следующие темы
- Переменные, типы данных, основные арифметические и логические операции, ввод / вывод значений
- Конструкции If, elif, else
- Циклы for и while
- Списки, генераторы списков, индексация списков, функции для списков
- Функции def и lambda, max и min и т.д.
- Рекурсия
- Срезы, обработка строк
- Множества и словари
- Работа с файлами
- Блок 1 — Вся База Для ЕГЭ По Информатике ( Теория + ДЗ ) ~ 5 часов
- Блок 2 — Задание №12 из ЕГЭ по Информатике ( Теория + ДЗ ) ~ 2 часа 30 мин.
❗ ВНИМАНИЕ!
- У курса нет старта. Вы можете начать его проходить в любой момент
- У курса нет подписок по месяцам. После покупки курса, вы получаете доступ к нему навсегда
- На курсе мы сначала рассказываем теорию, потом даём решить задачи по теме для отработки пройденного материала, а после показываем подробный видеоразбор каждой из них
- На курсе задания проверяются автоматически. Ждать проверки преподавателем не нужно
Источники Задач :
- Сайт kompege.ru
- Сайт kpolyakov.spb.ru
- Реальные ЕГЭ \ Демо-версии \ Досрочные волны \ Резервные дни \ Апробации
- СтатГрады \ Авторские Задачи
Для кого этот курс
Курс создан для Школьников 10-11 классов, учителей и всех остальных, желающих сдавать ЕГЭ по Информатике
Начальные требования
Никаких. Научим всему с полного нуля
Наши преподаватели
Как проходит обучение
- При переходе к новой теме вы сначала получаете всю необходимую теорию, потом мы задаём несколько контрольных вопросов по теме, чтобы вы смогли оценить уровень своих знаний, а после даём закрепить полученные знания на практике
- По мере прохождения курса у вас под рукой есть конспект по всем темам, чтобы вы могли быстро что-то вспомнить
- В комментариях вы можете посмотреть чужие решения, чтобы лучше разобраться в теме, а также предложить своё решение
- Во время обучения у вас есть возможность задать преподавателю любой вопрос
Программа курса
Что вы получаете
- Теоретические разборы в формате видео
- Базовые знания, обязательные для подготовки к ЕГЭ по информатике
- Поддержку преподавателя, который ответит на любой вопрос в кратчайшие сроки
- Уникальный конспект, в который включена вся теория по Python 3 для ЕГЭ
Муниципальное общеобразовательное учреждение «Средняя школа № 36»,город Ярославль
Внесены изменения в перечень версий стандартного программного обеспечения, предоставляемого участнику для выполнения единого государственного экзамена по информатике и ИКТ в компьютерной форме (перечень ПО КЕГЭ) в части добавления среды программирования для языка C#:
Перечень версий стандартного программного обеспечения,
предоставляемого участнику для выполнения единого государственного экзамена по информатике и ИКТ в компьютерной форме на территории Ярославской области в 2022
Программное обеспечение
ЗаPython’ил ЕГЭ на сотку или почему Python поможет на ЕГЭ
Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!
В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка Python.
Вот я и подумал, чтобы не получилось как в песне, стоит этим заняться. Я расскажу про все задачи первой части и их решения на примере демо варианта ЕГЭ за октябрь.
Всех желающих — приглашаю ниже!
Быстрый перевод из системы в систему
В Python есть интересные функции bin() , oct() и hex() . Работают данные функции очень просто:
bin(156) #Выводит '0b10011100' oct(156) #Выводит '0o234' hex(156) #Выводит '0x9c'

Как вы видите, выводится строка, где 0b — означает, что число далее в двоичной системе счисления, 0o — в восьмеричной, а 0x — в шестнадцатеричной. Но это стандартные системы, а есть и необычные.
Давайте посмотрим и на них:
n = int(input()) #Вводим целое число b = '' #Формируем пустую строку while n > 0: #Пока число не ноль b = str(n % 2) + b #Остатот от деления нужной системы (в нашем сл записываем слева n = n // 2 #Целочисленное деление print(b) #Вывод
Данная программа будет работать при переводе из десятичной системы счисления в любую до 9, так как у нас нет букв. Давайте добавим буквы:
n = int(input()) #Вводим целое число b = '' #Формируем пустую строку while n > 0: #Пока число не ноль if (n % 21) > 9: #Если остаток от деления больше 9. if n % 21 == 10: #. и равен 10. b = 'A' + b #. запишем слева A elif n % 21 == 11:#. и равен 11. b = 'B' + b#. запишем слева B ''' И так далее, пока не дойдём до системы счисления -1 (я переводил в 21-ную систему и шёл до 20) ''' elif n % 21 == 11: b = 'B' + b elif n % 21 == 12: b = 'C' + b elif n % 21 == 13: b = 'D' + b elif n % 21 == 14: b = 'E' + b elif n % 21 == 15: b = 'F' + b elif n % 21 == 16: b = 'G' + b elif n % 21 == 17: b = 'H' + b elif n % 21 == 18: b = 'I' + b elif n % 21 == 19: b = 'J' + b elif n % 21 == 20: b = 'K' + b else: #Иначе (остаток меньше 10) b = str(n % 21) + b #Остатот от деления записываем слева n = n // 21 #Целочисленное деление print(b) #Вывод
Способ объёмен, но понятен. Теперь давайте используем тот же функцию перевода из любой системы счисления в любую:
def convert_base(num, to_base=10, from_base=10): # Перевод в десятичную систему if isinstance(num, str): # Если число - строка, то . n = int(num, from_base) # . переводим его в нужную систему счисления else: # Если же ввели число, то . n = int(num) # . просто воспринять его как число # Перевод десятичной в 'to_base' систему alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Берём алфавит if n < to_base: # Если число меньше системы счисления в которую переводить. return alphabet[n] # . вернуть значения номера в алфавите (остаток от деления) else: # Иначе. return convert_base(n // to_base, to_base) + alphabet[n % to_base] # . рекурсивно обратиться к функии нахождения остатка
Вызвав функцию вывода print(convert_base(156, 16, 10)) мы переведём 156 из 10 в 16 систему счисления, а введя print(convert_base('23', 21, 4)) переведёт 23 из 4-ичной в 21-ичную систему (ответ: B).
Задача 2
Все задания беру из первого октябрьского варианта (он же вариант № 9325894) с сайта Решу.ЕГЭ.

Решение данной задачи совсем простое: банальный перебор.
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1' for x in range(2): for z in range(2): for w in range(2): F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию print(x, y, z, F) #Выводим результат

Нам вывелась вся таблица истинности (1 = True, 0 = False). Но это не очень удобно. Обратите внимание, что в задании, функция равно 0, так и давайте подправим код:
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1' for x in range(2): for z in range(2): for w in range(2): F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию if not F: print(x, y, z, F) #Выводим результат

Далее - простой анализ.
Задача 5

Данная задача легко решается простой последовательностью действий в интерпретационном режиме:

Задача 6

Перепечатали и получили ответ:
s = 0 k = 1 while s < 66: k += 3 s += k print(k)
Задача 12

В очередной раз, просто заменим слова на код:
a = '9' * 1000 while '999' in a or '888' in a: if '888' in a: a = a.replace('888', '9', 1) else: a = a.replace('999', '8', 1) print(a)
Задача 14

Компьютер железный, он всё посчитает:
a = 4 ** 2020 + 2 ** 2017 - 15 k = 0 while a > 0: if a % 2 == 1: k += 1 a = a // 2 print(k)
Задача 16

Опять же, просто дублируем программу в python:
def F(n): if n > 0: F(n // 4) print(n) F (n - 1) print(F(5))

Задача 17

Задача с файлом. Самое сложное - достать данные из файла. Но где наша не пропадала?!
with open("17.txt", "r") as f: #Открыли файл 17.txt для чтения text = f.read() #В переменную text запихнули строку целиком a = text.split("\n") #Разбили строку энтерами (\n - знак перехода на новую строку) k = 0 #Стандартно обнуляем количество m = -20001 #Так как у нас сумма 2-ух чисел и минимальное равно -10000, то минимум по условию равен -20000, поэтому. for i in range(len(a)): #Обходим все элементы массива if (int(a[i - 1]) % 3 == 0) or (int(a[i]) % 3 == 0): #Условное условие k += 1 #Счётчик if int(a[i - 1]) + int(a[i]) > m: #Нахождение минимума m = int(a[i - 1]) + int(a[i]) print(k, m) #Вывод
Немного пояснений. Функция with() открывает файл считывает данные при помощи функции read() и закрывает файл. В остальном - задача стандартна.
Задача 19, 20 и 21
Все три задачи - задачи на рекурсию. Задачи идентичны, а вопросы разные. Итак, первая задача:

Пишем рекурсивную функцию и цикл перебора S:
def f(x, y, p): #Рекурсивная функция if x + y >= 69 or p > 3: #Условия завершения игры return p == 3 return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or\ f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий for s in range (1, 58 + 1): #Перебор S if f(10, s, 1): #Начали с 10 камней print(s) break
Немного пояснений. В рекурсивной функции существует 3 переменные x - число камней в первой куче, y - число камней во второй куче, p - позиция. Позиция рассчитывается по таблице: