Задача курса

Python: Обобщённая функция firstandlast с TypeVar и bound

Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Обобщённые типы: TypeVar и Generic»

Условие

Обобщённая функция first_and_last с TypeVar и bound

Ты реализуешь обобщённую функцию, которая сохраняет конкретный тип элементов последовательности в возвращаемом значении.

Что уже дано

Проверяющая система вызывает твою функцию first_and_last с разными аргументами. Никаких глобальных переменных или файлов заранее не создаётся. В редакторе есть импорты и сигнатура с pass.

Также в редакторе объявлен базовый класс Scored и два его подкласса — StudentRecord и CourseResult. Они уже готовы; ты не должен их менять.

Что нужно сделать

Объяви на верхнем уровне:

  1. T = TypeVar('T') — свободный TypeVar для общего случая.
  2. S = TypeVar('S', bound='Scored') — TypeVar, ограниченный классом Scored.
  3. def first_and_last(items: list[T]) -> tuple[T, T] — обобщённая функция, которая:
  • принимает непустой список элементов любого типа;
  • возвращает кортеж (items[0], items[-1]).
  1. def best_and_worst(items: list[S]) -> tuple[S, S] — обобщённая функция с ограничением bound=Scored, которая:
  • принимает непустой список объектов, являющихся Scored или его подтипом;
  • сортирует список по атрибуту score (от большего к меньшему) без изменения исходного списка;
  • возвращает кортеж (лучший, худший) — первый и последний элементы отсортированного списка.

Не добавляй isinstance-проверки и не меняй классы Scored, StudentRecord, CourseResult.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система вызывает first_and_last и best_and_worst напрямую с разными аргументами и проверяет возвращаемые значения.

Для first_and_last:

  • аргумент items — список произвольных элементов одного типа (например, list[int], list[str]);
  • возвращаемое значение — кортеж из двух элементов того же типа.

Для best_and_worst:

  • аргумент items — список объектов типа StudentRecord или CourseResult;
  • возвращаемое значение — кортеж (с наибольшим score, с наименьшим score).

Пример использования

print(repr(first_and_last([10, 20, 30])))

Результат:

[10, 30]

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется