Аннотации типов в Python — это способ явно указать, какие типы данных ожидает функция на входе и что она возвращает. Они не влияют на выполнение программы (интерпретатор их игнорирует), но делают код понятнее для других разработчиков и позволяют использовать инструменты статического анализа вроде mypy. В этом тренажере ты научишься правильно записывать аннотации для параметров функций и возвращаемых значений, работать с базовыми и составными типами из модуля typing, а также понимать, что означают те или иные аннотации в чужом коде. Задания построены от простого к сложному: сначала базовый синтаксис, потом коллекции и специальные типы вроде Optional и Union.
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Базовый синтаксис аннотации параметра
Функция принимает имя пользователя и выводит приветствие. Добавьте аннотацию типа для параметра, указав что он должен быть строкой.
def greet(name: input1S):
print(f"Привет, {name}!")Аннотация возвращаемого значения
Функция вычисляет площадь прямоугольника. Заполните пропуски: укажите типы параметров и тип возвращаемого значения.
def calculate_area(width: input1S, height: input2S) input3S float:
return width * heightАннотации и реальное поведение
Посмотрите на код с аннотациями типов. Что произойдёт при его выполнении?
def double(x: int) -> int:
return x * 2
result = double("abc")
print(result)Сопоставьте типы и их назначение
Соотнесите типы из модуля typing с их описанием. Перетащите элементы справа к соответствующим описаниям слева.
Optional[str]List[int]Union[int, str]Dict[str, int]Исправьте синтаксис аннотации
В этом коде допущены ошибки в синтаксисе аннотаций типов. Найдите и исправьте строки с ошибками.
def process_data(items: list, count = int) => str: return str(items[:count])Соберите функцию с аннотациями из модуля typing
Функция принимает список целых чисел и возвращает словарь, где ключ — число, а значение — его квадрат. Используйте токены из банка для правильной аннотации.
from typing import input1S, input2S
def squares(numbers: input3S) -> input4S:
return {n: n ** 2 for n in numbers}Классификация аннотаций типов
Распределите аннотации по категориям: встроенные типы Python, типы из модуля typing и специальные значения.
strList[int]NonedictOptional[str]intUnion[int, float]boolДоступ к аннотациям через __annotations__
В Python аннотации функции хранятся в специальном атрибуте. Что выведет этот код? Введите значение для ключа 'return'.
def add(a: int, b: int) -> int:
return a + b
annotations = add.__annotations__
print(annotations['return'].__name__)Optional — значение или None
Функция ищет пользователя по ID и возвращает его имя, если найден, или None. Заполните аннотации, используя Optional.
from typing import Optional
def find_user(user_id: input1S) -> input2S:
users = {1: "Alice", 2: "Bob"}
return users.get(user_id)Соберите функцию с Callable
Соберите функцию, которая принимает другую функцию (callback) и число. Callback должен принимать int и возвращать int. Порядок: импорт, определение функции, тело функции.
from typing import Callable return callback(value)def apply(callback: Callable[[int], int], value: int) -> int:from typing import Listdef apply(callback: function, value: int) -> int:Union для нескольких типов
Функция может принимать число в разных форматах. Проанализируйте код и определите, что он выведет.
from typing import Union
def normalize(value: Union[int, str]) -> int:
if isinstance(value, str):
return int(value)
return value
result = normalize("42") + normalize(8)
print(result)Исправьте аннотации для кортежа
Функция возвращает координаты точки как кортеж из двух float. В аннотациях допущены ошибки — исправьте их.
from typing import Tuple def get_point(x: float, y: float) -> tuple(float, float): return (x, y)Порядок определения типизированной функции
Расставьте строки в правильном порядке, чтобы получить корректную функцию с аннотациями типов, которая обрабатывает список строк.
def process_names(names: List[str]) -> List[str]:from typing import List """Преобразует имена в верхний регистр.""" return [name.upper() for name in names]Современный синтаксис Python 3.10+
Начиная с Python 3.10 можно использовать упрощённый синтаксис для Union. Заполните пропуски, используя новый синтаксис с оператором |.
# Python 3.10+ синтаксис (без импорта typing!)
def parse_input(value: input1S) -> int:
"""Парсит строку или число в целое число."""
if isinstance(value, str):
return int(value)
return value
def find_item(items: list, key: str) -> input2S:
"""Возвращает элемент или None, если не найден."""
return items.get(key)Соберите класс с аннотированными атрибутами
Соберите класс User с аннотациями типов для атрибутов. Используйте dataclass для автоматической генерации __init__. Порядок: импорты, декоратор, определение класса, атрибуты.
from dataclasses import dataclass@dataclassfrom typing import Optional name: str email: Optional[str] = Noneclass User:from typing import Union name = str@dataclasses