Во всех задачах реализуй соответствующие классы, соблюдай правила ООП.
Создай класс BankAccount с приватным атрибутом баланса.
- Метод
deposit(amount)— пополнение счёта. - Метод
withdraw(amount)— снятие со счёта (не снимать больше, чем есть). - Метод
get_balance()— возвращает текущий баланс.
Создай два класса:
Speakerс методомplay_music()Lampс методомturn_on_light()
Создай класс SmartDevice, который наследует оба и добавляет метод activate() — включает музыку и свет.
Product: название, цена, вес.Item: содержитProductи количество.ShoppingCart: список объектовItem.
- Если товар уже есть в корзине (сравнение по названию), нужно увеличить количество в существующем
Item. - Если такого товара ещё нет, создать новый
Itemи добавить его в корзину. - При добавлении отрицательного количества — выбросить
ValueError.
- Удаляет
Item, содержащийProduct, из корзины. - Если товар не найден, вывести сообщение:
Продукт '<название>' не найден в корзине.
get_total_price()— общая стоимость всех товаров.get_total_weight()— общий вес всех товаров.__len__()— количество разных товаров (Item).__str__()— красивый вывод содержимого корзины.
Добавь в ShoppingCart:
- Метод обновления количества товара.
- Проверки на отрицательные значения цены, веса, количества.
- Поддержку сложения корзин (
+) — складываются количества совпадающих товаров. - Сортировку по:
- цене (если одинаково — по весу, потом по названию),
- весу,
- названию.
- Поддержку
inи индексированного доступа ([]).
Contact: имя, телефон, e-mailAddressBook: список контактов, методadd_contact
Добавь SaveToFileMixin с методом save_to_file(filename), который сохраняет текстовое представление объекта в файл.
ContactиAddressBookдолжны использовать этот миксин.
Добавь:
- Проверку на дублирование по email (удалять старый при совпадении).
- Удаление по имени.
- Поиск контактов по имени.
Реализуй:
Card: ранг (6–A) и масть (♠ ♥ ♦ ♣)Deck: 36 карт
- Перетасовать
- Вытянуть карту
- Показать козырь (последняя карта)
- Метод
beats(other, trump_suit)— побеждает ли карта другую по правилам «дурака»
- Хранит температуру в Цельсиях.
@classmethod:from_fahrenheit(cls, f)from_kelvin(cls, k)
@property:fahrenheitkelvin
Создай абстрактный класс Shape и классы-наследники:
Circle,Rectangle,Square
Создай ShapeFactory с методом create_shape(type: str) для создания фигур.
- Класс
Product: название, цена, вес - Разные стратегии сортировки:
- по цене
- по алфавиту
- по весу
Реализуй отдельные классы-стратегии и класс ProductSorter, который принимает стратегию и сортирует список.
Реализуй класс узла Node(value, left=None, right=None) и класс BinaryTree.
- Методы обхода:
preorder(),inorder(),postorder()— возвращают список значений. height()— высота дерева;count_leaves()— число листьев.is_balanced()— разница высот поддеревьев каждого узла не больше 1.__iter__()— итерирование по дереву (например, inorder).- Поддержка пустого дерева (корень
None).
- Пустое дерево, дерево из одного узла, сильно «кривое» дерево (цепочка).
Построй на основе Node/BinaryTree класс BST.
insert(value),search(value) -> bool,remove(value)(3 случая удаления: лист, один ребёнок, два ребёнка).min(),max(),to_sorted_list()(inorder даёт отсортированный список).validate() -> bool— проверка свойства BST на всём дереве.from_sorted_list(values)— построение почти сбалансированного BST из отсортированного списка.
- Средний случай: поиск/вставка/удаление —
O(log n), худший —O(n)при вырождении.
Реализуй класс Graph, использующий список смежности. Поддержи как ориентированные, так и неориентированные графы.
- Базовые операции:
add_vertex(v),add_edge(u, v),remove_edge(u, v),neighbors(v). - Обходы:
bfs(start) -> порядок вершин,dfs(start) -> порядок вершин. shortest_path(u, v)— кратчайший путь в невзвешенном графе (BFS), вернуть список вершин.connected_components()— компоненты связности (для неориентированного графа).has_cycle()— обнаружение цикла (для направленного и/или ненаправленного графа; допустимы отдельные методыhas_cycle_directed/has_cycle_undirected).topological_sort()— для DAG (если цикл найден — выбросить исключение или вернуть индикатор ошибки).
- Для топологической сортировки можно использовать алгоритм Кана или DFS с порядком завершения.
Смоделируй историю репозитория Git как ориентированный ациклический граф: каждый коммит ссылается на одного или нескольких родителей.
- Класс
Commit(id/хеш, метаданные по желанию, список родителей). - Класс
CommitGraph:add_commit(id, parents: list[str])is_ancestor(a, b) -> bool— является лиaпредкомb.merge_base(a, b)— общий ближайший предок (аналогgit merge-base).topo_order()— топологический порядок коммитов.
- Валидация: граф должен оставаться ацикличным (при попытке создать цикл — ошибка).
- Это учебная модель: хеши/ветки/теги можно упростить до строк.
К каждой задаче необходимо написать модульные тесты с использованием стандартного модуля unittest.