From 4ecf0d28feed54c97b0ae65655355c594374a29e Mon Sep 17 00:00:00 2001 From: GorelovNN Date: Mon, 22 May 2023 13:40:28 +0500 Subject: [PATCH] HomeWork_8 done --- .idea/workspace.xml | 177 ++++++++++++++++++ .../task_1.py" | 65 ++++++- .../task_2.py" | 31 ++- .../task_3.py" | 28 ++- .../task_4_5_6.py" | 107 ++++++++++- .../task_7.py" | 37 +++- 6 files changed, 432 insertions(+), 13 deletions(-) create mode 100644 .idea/workspace.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..4dbf6905a --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + { + "keyToString": { + "RunOnceActivity.ShowReadmeOnStart": "true", + "last_opened_file_path": "D:/GeekBrains EDU/Лекции/8. Основы языка Python/python_basics" + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1683649224128 + + + + + + + \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 5b4641e41..c3459f345 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -10,5 +10,68 @@ год, преобразовывать их тип к типу «Число» и делать атрибутами класса. Второй, с декоратором @staticmethod, должен проводить валидацию числа, месяца -и года (например, месяц — от 1 до 12). Проверить работу полученной структуры на реальных данных. +и года (например, месяц — от 1 до 12). Проверить работу полученной структуры +на реальных данных. """ + + +class Date: + day_month_year = "" + + @classmethod + def get_int_values(cls): + try: + print(Date.day_month_year.split('-')) + except BaseException as e: + print(f"Errors: {e}") + + @staticmethod + def validate_data(): + try: + __errors = [] + __year = int(Date.day_month_year.split('-')[2]) + __month = int(Date.day_month_year.split('-')[1]) + __day = int(Date.day_month_year.split('-')[0]) + _days = -1 + + if __year < 1000: + __errors.append(f"Некорректный формат года: [{__year}]") + + if __month < 1 or __month > 12: + __errors.append(f"Некорректный формат месяца: [{__month}]") + + if __month == 1 \ + or __month == 3 \ + or __month == 5 \ + or __month == 7 \ + or __month == 8 \ + or __month == 10 \ + or __month == 12: + _days = 31 + elif __month == 4 \ + or __month == 6 \ + or __month == 9 \ + or __month == 11: + _days = 30 + elif __year % 4 == 0 and __year % 100 != 0 or __year % 400 == 0: + _days = 29 + else: + __days = 28 + + if (__day > _days or __day < 1) and len(__errors) == 0: + print(f"Некорретное число дней в месяце: [{__day}]") + + if len(__errors) > 0: + print("Ошибки при проверке даты:") + for el in __errors: + print(el) + else: + print(f"Формат даты корректный: {Date.day_month_year}") + + except BaseException as e: + print(f"Error: {e}") + + +Date.day_month_year = "31-11-2022" +Date.validate_data() +Date.get_int_values() diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 12e1c68b3..1f65caf47 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -1,7 +1,32 @@ """ Задание 2. -Создайте собственный!!! класс-исключение, обрабатывающий ситуацию деления на нуль. -Проверьте его работу на данных, вводимых пользователем. При вводе пользователем нуля -в качестве делителя программа должна корректно обработать эту ситуацию и не завершиться с ошибкой. +Создайте собственный!!! класс-исключение, обрабатывающий ситуацию деления +на нуль. +Проверьте его работу на данных, вводимых пользователем. +При вводе пользователем нуля в качестве делителя программа должна корректно +обработать эту ситуацию и не завершиться с ошибкой. """ + + +class ZeroDivOwn(Exception): + def __init__(self, text): + self.text = text + + +try: + base_value = 10 + input_value = int(input("Введите число: ")) + + if input_value == 0: + raise ZeroDivOwn("Деление на ноль невозможно") + else: + out_value = base_value / input_value + +except ZeroDivOwn as e: + print(e) + +except ValueError as e: + print(f"В делении участвует не число: {e}") +else: + print(f"Результат деления: {out_value}") diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index ae100adca..a0f356ce0 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -4,8 +4,32 @@ Создайте собственный класс-исключение, который должен проверять содержимое списка на наличие только чисел. -Проверить работу исключения на реальном примере. Необходимо запрашивать у пользователя данные и заполнять -список только числами. +Проверить работу исключения на реальном примере. Необходимо запрашивать у +пользователя данные и заполнять список только числами. Класс-исключение должен контролировать типы данных элементов списка. """ + + +class NotNumbersOwn(Exception): + def __init__(self, text): + self.text = text + + +my_list = [] + +while True: + line = input("Введите число: ") + if line == "stop": + break + else: + try: + if line.isnumeric(): + my_list.append(int(line)) + else: + raise NotNumbersOwn("Переданное значение не является числом") + except NotNumbersOwn as e: + print(e) + +if len(my_list) > 0: + print(my_list) diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4_5_6.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4_5_6.py" index 29a002d49..344ab7c17 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4_5_6.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4_5_6.py" @@ -1,9 +1,11 @@ """ -4. Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. +4. Начните работу над проектом «Склад оргтехники». Создайте класс, + описывающий склад. А также класс «Оргтехника», который будет базовым для классов-наследников. Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс). В базовом классе определить параметры, общие для приведенных типов. -В классах-наследниках реализовать параметры, уникальные для каждого типа оргтехники. +В классах-наследниках реализовать параметры, уникальные для каждого +типа оргтехники. 5. Продолжить работу над четвертым заданием. Разработать методы, отвечающие за приём оргтехники на @@ -12,10 +14,107 @@ количестве единиц оргтехники, а также других данных, можно использовать любую подходящую структуру, например словарь. -6. Продолжить работу над пятым заданием. Р -еализуйте механизм валидации вводимых пользователем данных. +6. Продолжить работу над пятым заданием. Реализуйте механизм валидации +вводимых пользователем данных. Например, для указания количества принтеров, отправленных на склад, нельзя использовать строковый тип данных. Подсказка: постарайтесь по возможности реализовать в проекте «Склад оргтехники» максимум возможностей, изученных на уроках по ООП. """ + + +class NotNumbersOwn(Exception): + def __init__(self, text): + self.text = text + + +class Storage: + def __init__(self): + self.__storage_area = [] + self.__journal = [] + + def put_to_storage(self, item, count): + for n in range(count): + self.__storage_area.append(item) + + def get_storage(self): + print(f"На складе '{len(self.__storage_area)}' единицы товара:") + for key, i in enumerate(self.__storage_area, 1): + print(key, i) + + def move_to_dep(self, item_id, dep_name): + try: + item = self.__storage_area.pop(item_id) + print(f"{item} был передан в подразделение '{dep_name}'") + except IndexError as err: + print(f"{err}") + + +class OfficeEquipment: + def __init__(self, voltage, weight): + self.voltage = voltage + self.weight = weight + + +class Printer(OfficeEquipment): + def __init__(self, voltage, weight, paper_capacity, is_color): + super().__init__(voltage, weight) + self.paper_capacity = paper_capacity + self.is_color = is_color + + def __str__(self): + return f"Printer (voltage: {self.voltage}," \ + f" weight: {self.weight}," \ + f"paper_capacity: {self.paper_capacity}," \ + f"is_color: {self.is_color})" + + +class Scanner(OfficeEquipment): + def __init__(self, voltage, weight, height): + super().__init__(voltage, weight) + self.height = height + + def __str__(self): + return f"Scanner (voltage: {self.voltage}," \ + f" weight: {self.weight}," \ + f"height: {self.height})" + + +class Xerox(OfficeEquipment): + def __init__(self, voltage, weight, print_width): + super().__init__(voltage, weight) + self.print_width = print_width + + def __str__(self): + return f"Xerox (voltage: {self.voltage}," \ + f" weight: {self.weight}," \ + f"print_width: {self.print_width})" + + +my_printer = Printer(220, 210, 1000, True) +my_scanner = Scanner(220, 210, 400) +my_xerox = Xerox(220, 210, 297) +my_xerox_2 = Xerox(220, 140, 297) + +my_storage = Storage() + + +try: + line = input(f"Введите количество техники, " + f"которую нужно отправить на склад: ") + + if line.isnumeric(): + my_storage.put_to_storage(my_printer, int(line)) + my_storage.put_to_storage(my_scanner, int(line)) + my_storage.put_to_storage(my_xerox, int(line)) + else: + raise NotNumbersOwn("Переданное значение не является числом") +except NotNumbersOwn as e: + print(e) + +my_storage.get_storage() +print() +my_storage.move_to_dep(0, 'Отдел кадров') +my_storage.move_to_dep(1, 'Отдел кадров') +print() +my_storage.get_storage() diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" index 023fa7dbd..3b2526826 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" @@ -1,8 +1,39 @@ """ Задание 7.* -Реализовать проект «Операции с комплексными числами». Создайте класс «Комплексное число», -реализуйте перегрузку методов сложения и умножения комплексных чисел. Проверьте работу проекта, -создав экземпляры класса (комплексные числа) и выполнив сложение и умножение созданных экземпляров. +Реализовать проект «Операции с комплексными числами». Создайте класс +«Комплексное число», +реализуйте перегрузку методов сложения и умножения комплексных чисел. + Проверьте работу проекта, +создав экземпляры класса (комплексные числа) и выполнив сложение и +умножение созданных экземпляров. Проверьте корректность полученного результата. """ + + +class ComplexNumber: + + def __init__(self, real, imaginary): + self.real = real + self.imaginary = imaginary + + def __add__(self, other): + return ComplexNumber(self.real + other.real, + self.imaginary + other.imaginary) + + def __mul__(self, other): + return ComplexNumber((self.real * other.real - + self.imaginary * other.imaginary), + (self.real * other.imaginary + + other.real * self.imaginary)) + + def __str__(self): + return f'{self.real}{"+" if self.imaginary > 0 else ""}' \ + f'{self.imaginary}i' + + +cn_1 = ComplexNumber(1, -2) +cn_2 = ComplexNumber(3, 4) + +print(cn_1 + cn_2) +print(cn_1 * cn_2)