From 5b6f2916a6bd658e143ec9acba64ce71de590c8f Mon Sep 17 00:00:00 2001 From: vitaliy Date: Mon, 27 Oct 2025 14:38:51 +0300 Subject: [PATCH] Lesson 12 --- lesson_12/code/db.py | 79 +++++++++++++++++++++++++++++++++++ lesson_12/code/oop.py | 15 +++++++ lesson_12/home_task/task39.py | 32 ++++++++++++++ lesson_12/home_task/task40.py | 21 ++++++++++ lesson_12/home_task/task41.py | 40 ++++++++++++++++++ 5 files changed, 187 insertions(+) create mode 100644 lesson_12/code/db.py create mode 100644 lesson_12/code/oop.py create mode 100644 lesson_12/home_task/task39.py create mode 100644 lesson_12/home_task/task40.py create mode 100644 lesson_12/home_task/task41.py diff --git a/lesson_12/code/db.py b/lesson_12/code/db.py new file mode 100644 index 0000000..6fafb3a --- /dev/null +++ b/lesson_12/code/db.py @@ -0,0 +1,79 @@ +import psycopg2 + +dbname='llm' +user='postgres' +host='localhost' +password='123' +id=1 + +try: + conn = psycopg2.connect(f"dbname={dbname} user={user} host={host} password={password} ") +except: + print("I am unable to connect to the database") + + +# we use a context manager to scope the cursor session +with conn.cursor() as curs: + try: + # simple single row system query + curs.execute(""" + CREATE TABLE IF NOT EXISTS cinemas ( + id serial, + name text, + describe text + ); + """) + print("OK") + conn.commit() + # a more robust way of handling errors + except (Exception, psycopg2.DatabaseError) as error: + print(error) + try: + curs.execute(""" + INSERT + INTO + cinemas("name", describe) + VALUES('Иллюзия обмана', 'Про фокусы !'); + """) + conn.commit() + except (Exception, psycopg2.DatabaseError) as error: + print(error) + + try: + curs.execute(f""" + DELETE + FROM + cinemas + WHERE ID={id} + """) + conn.commit() + except (Exception, psycopg2.DatabaseError) as error: + print(error) + + try: + curs.execute(f""" + UPDATE cinemas SET name='Иллюзия любви!', describe='No name' + WHERE ID=2 + """) + conn.commit() + except (Exception, psycopg2.DatabaseError) as error: + print(error) + + + try: + curs.execute(f""" + SELECT id, name, describe + FROM cinemas + + """) + + _rows = curs.fetchall() + for row in _rows: + id, name, desc = row + print(f"id: {id}, name: {name}, desc: {desc}") + + except (Exception, psycopg2.DatabaseError) as error: + print(error) + + +conn.close() \ No newline at end of file diff --git a/lesson_12/code/oop.py b/lesson_12/code/oop.py new file mode 100644 index 0000000..ab861f9 --- /dev/null +++ b/lesson_12/code/oop.py @@ -0,0 +1,15 @@ +class Mammal: + def move(self, x): + print('Двигается') + + +class Hare(Mammal): + def move(self, x, y ): + print('Прыгает') + + +animal = Mammal() +animal.move(100) # Двигается + +hare = Hare() +hare.move(100) # Прыгает ???? \ No newline at end of file diff --git a/lesson_12/home_task/task39.py b/lesson_12/home_task/task39.py new file mode 100644 index 0000000..26a7379 --- /dev/null +++ b/lesson_12/home_task/task39.py @@ -0,0 +1,32 @@ +# Модель учебных материалов +# todo: Создайте иерархию классов для представления различных типов учебных материалов. +# +# Требования: Базовый класс LearningMaterial: +# Свойства: title, author, duration_minutes +# Методы: +# display_info() - выводит основную информацию +# get_difficulty() - возвращает сложность материала (должен быть переопределен в дочерних классах) +# +# Дочерние классы: +# VideoLesson: +# Дополнительные свойства: video_quality, subtitles_available +# Сложность: "Средняя" +# +# Article: +# Дополнительные свойства: word_count, reading_level +# Сложность: рассчитывается как word_count / 1000 (легкая если <1, средняя 1-3, сложная >3) +# +# Quiz: +# Дополнительные свойства: questions_count, passing_score +# Сложность: "Высокая" если passing_score > 80, иначе "Средняя" + + +# Этот код должен работать после реализации: +materials = [ + VideoLesson("Python ООП", "Иван Иванов", 45, "1080p", True), + Article("Глубокое обучение", "Анна Петрова", 1200, "advanced"), + Quiz("Проверка знаний", "Платформа", 20, 75, 10) +] + +for material in materials: + print(f"{material.title}: {material.get_difficulty()}") \ No newline at end of file diff --git a/lesson_12/home_task/task40.py b/lesson_12/home_task/task40.py new file mode 100644 index 0000000..10939e7 --- /dev/null +++ b/lesson_12/home_task/task40.py @@ -0,0 +1,21 @@ +# Система уведомлений (Полиморфизм) +# todo: Реализовать систему отправки уведомлений пользователям через разные каналы. +# +# Требования: +# Базовый класс NotificationSender с методом send(message, user) +# Дочерние классы: +# EmailSender: отправляет email с темой "Образовательная платформа" +# SMSSender: отправляет SMS (первые 50 символов сообщения) +# PushSender: отправляет push-уведомление с иконкой "🎓" +# +# Класс пользователя User: +# Свойства: name, preferred_notifications (список объектов NotificationSender) + + +# Этот код должен работать после релизации: +user = User("Мария", [EmailSender(), PushSender()]) +notify_user(user, "Блок аналитики начинается с 27 октября!") + +def notify_user(user, message): + for sender in user.preferred_notifications: + sender.send(message, user) \ No newline at end of file diff --git a/lesson_12/home_task/task41.py b/lesson_12/home_task/task41.py new file mode 100644 index 0000000..e9f892b --- /dev/null +++ b/lesson_12/home_task/task41.py @@ -0,0 +1,40 @@ +# todo: Создайте иерархию классов для экспорта данных в разные форматы. +# Требования: +# Абстрактный базовый класс DataExporter: +# +# Методы: +# export(self, data) - абстрактный метод +# get_format_name(self) - возвращает название формата +# validate_data(self, data) - общий метод проверки данных (не пустые ли) +# +# Конкретные реализации: +# JSONExporter: +# Экспортирует данные в JSON-формат +# Добавляет поле "export_timestamp" с текущим временем +# +# CSVExporter: +# Экспортирует данные в CSV (если data - список словарей) +# Автоматически определяет заголовки из ключей первого элемента +# +# XMLExporter: +# Создает XML структуру с корневым элементом +# HTMLExporter (дополнительно): +# Создает красивую HTML-таблицу с CSS-стилями + + +# Этот код должен работать после реализации: +sales_data = [ + {"product": "Laptop", "price": 1000, "quantity": 2}, + {"product": "Mouse", "price": 50, "quantity": 10} +] + +exporters = [ + JSONExporter(), + CSVExporter(), + XMLExporter() +] + +for exporter in exporters: + print(f"Формат: {exporter.get_format_name()}") + exporter.export(sales_data) + print("---") \ No newline at end of file