Задача курса
Python: Обобщённая функция firstandlast с TypeVar и bound
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Обобщённые типы: TypeVar и Generic»
Условие
Обобщённая функция first_and_last с TypeVar и bound
Ты реализуешь обобщённую функцию, которая сохраняет конкретный тип элементов последовательности в возвращаемом значении.
Что уже дано
Проверяющая система вызывает твою функцию first_and_last с разными аргументами. Никаких глобальных переменных или файлов заранее не создаётся. В редакторе есть импорты и сигнатура с pass.
Также в редакторе объявлен базовый класс Scored и два его подкласса — StudentRecord и CourseResult. Они уже готовы; ты не должен их менять.
Что нужно сделать
Объяви на верхнем уровне:
T = TypeVar('T')— свободный TypeVar для общего случая.S = TypeVar('S', bound='Scored')— TypeVar, ограниченный классомScored.def first_and_last(items: list[T]) -> tuple[T, T]— обобщённая функция, которая:
- принимает непустой список элементов любого типа;
- возвращает кортеж
(items[0], items[-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]
