Програмування для іспиту: відповіді на Python, які набирають бали
Як писати код на Python на іспитах, щоб він справді отримав максимум балів — структура, граничні випадки та управління часом під тиском.
Перевіряючі іспити не запускають ваш код у відлагоджувачі двадцять хвилин. Вони читають його один раз, можливо двічі, і перевіряють за критеріями оцінювання. Робочий розв'язок, який ігнорує критерії, все одно може втратити бали, а дещо менш ідеальний розв'язок, що задовольняє всі контрольні пункти, може набрати більше. Писати Python для іспиту — це інша навичка, ніж писати Python для реального проекту, і варто практикуватися окремо.
Прочитайте критерії перед тим, як двічі читати завдання
Більшість іспитів з програмування — питання у стилі AP CS A, університетські контрольні роботи, оцінювання в bootcamp'ах — публікують правила часткового кредиту. Типовий рядок критеріїв виглядає так: "1 бал за правильну структуру циклу, 1 бал за правильне значення повернення, 1 бал за обробку порожного списку." Якщо ви напишете густий однорядковик, що дає правильну відповідь, але пропускає явний цикл, деякі перевіряючі зніжать вам бали, навіть якщо результат правильний.
Перед тим, як щось писати, визначте частини, які перевіряючий, ймовірно, перевіритиме окремо:
- Сигнатура функції точно відповідає тому, що було запитано (ім'я, порядок параметрів, тип повернення)
- Базовий випадок і рекурсивний випадок, якщо очікується рекурсія
- Межі циклу (помилки на одиницю — найпоширеніша втрата балів)
- Граничні випадки: порожний вхід, вхід з одного елемента, від'ємні числа, дублікати
Напишіть їх коментарями спочатку. # обробити порожний список, # базовий випадок: n == 0. Це займе десять секунд і гарантує, що ви не забудете випадок, який перевіряючий спеціально шукає.
Структурюйте код так, щоб частковий кредит був видимий
Порівняйте дві відповіді на запитання "напишіть функцію, яка повертає друге найбільше число в списку":
def second_largest(nums):
return sorted(nums)[-2]
def second_largest(nums):
if len(nums) < 2:
return None
largest = second = float('-inf')
for n in nums:
if n > largest:
second = largest
largest = n
elif n > second and n != largest:
second = n
return second
Перший варіант правильний для коректного вводу, але падає на списку з менш ніж двома елементами і дає неправильну відповідь на дублікати на кшталт [5, 5, 3] (повертає 5, що може бути неправильно залежно від специфікації). Другий варіант довший, але кожен рядок критеріїв — граничний випадок, правильна логіка, правильне повернення — явний і отримує свій рядок, який перевіряючий може відзначити. На іспиті з часовим обмеженням другий варіант набирає більше балів майже кожного разу, хоча набирати його довше.
Не оптимізуйте передчасно, але й не залишайте очевидні помилки
Іспити рідко перевіряють знання Big-O, якщо вони прямо про це не кажуть. Якщо завдання каже "напишіть функцію, яка знаходить дублікати", вкладений цикл O(n²) нормальний, якщо тільки завдання не вказує на великий вхід або не просить ефективне рішення. Витрачати час іспиту на перетворення на підхід на основі множини O(n), коли це не було запитано, — це час, який ви не отримаєте назад.
Те сказавши, деякі помилки завжди вас будуть коштувати незалежно від критеріїв:
- Використання
==замістьisнепослідовно, що викликає логічні помилки (рідко в іспитах Python, але з'являється в питаннях із багатьма порівняннями) - Мутація списку під час ітерації над ним —
for x in lst: lst.remove(x)— це класична пастка на іспиту, яка дає мовчазно неправильний результат - Забування
returnі друк замість цього — багато автоперевіряч перевіряють значення повернення, не stdout - Помилка на одиницю в
range()—range(len(nums))vsrange(len(nums) - 1)варто перевірити кожного разу
Трасуйте ваш код вручну перед надсиланням
На паперових іспитах та більшості вбудованих у браузер іспитів з кодування ви не можете запустити код. Виберіть один невеликий приклад і трасуйте його рядок за рядком, записуючи значення змінних у процесі. Це ловить близько 80% логічних помилок менш ніж за дві хвилини, і це найвища цінність, яку ви можете отримати від вільного часу.
Для рекурсивних функцій зокрема трасуйте принаймні два рівні глибини і явно напишіть, коли базовий випадок досягнув. Перевіряючі часто дають бал просто за демонстрацію того, що базовий випадок правильно завершується, окремо від балу за правильність рекурсивного випадку.
Керуйте часом як ресурсом, не як додатковою думкою
Якщо розділ вільної відповіді варто 9 балів у трьох підпитаннях, приблизно розподіліть рівномірно час і рухайтеся далі, якщо ви застрягли більше того бюджету — напівнаписана, але майже правильна частина (b) варто більше сирих балів, ніж ідеальна частина (a) і порожня частина (c). Напишіть функцію-заглушку з правильною сигнатурою і pass або здогадку, навіть якщо ви не можете завершити логіку; сама правильна сигнатура іноді варто балу критеріїв.
Для більшої інформації про написання чистого, тестованого Python поза аудиторією іспиту та про структури даних, які постійно з'являються в цих завданнях, перегляньте пов'язані розділи Python та Computer Science на Korra Studio.
Написано з допомогою штучного інтелекту, перевірено та опубліковано Мішалем Пільчем (CISSP), Korra Studio.
Це одна замітка з бази знань Korra Studio — платформа поєднує кожну тему з 1-на-1 менторингом.
Початок безплатноarrow_forward