diff --git a/less-07/task-01.py b/less-07/task-01.py new file mode 100644 index 0000000..4231cea --- /dev/null +++ b/less-07/task-01.py @@ -0,0 +1,51 @@ +# Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод __init__()), +# который должен принимать данные (список списков) для формирования матрицы. +# Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +# Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов +# класса Matrix (двух матриц). Результатом сложения должна быть новая матрица. + +class Matrix(): + """Клас для работы с матрицами в ячейках которых целые числа""" + def __init__(self,data): + self.m = data + + def __str__(self): + return '\n'.join([''.join(['%d\t' % i for i in row]) for row in self.m]) + + def __add__(self, other): + if self.size != other.size: + raise ValueError('Для сложения необходимы равные по размеру матрицы') + #return Matrix([[0]]) # без raise + return Matrix(list(map( + lambda x, y: list(map(lambda z, w: z + w, x, y)), + self.m, other.m))) + + @property + def size(self): + return (len(self.m), len(self.m[0])) + + +my_list_1=[[1,0,0],[0,1,0],[0,0,1]] # еденичная матрица +my_list_2 = [[2,2,2],[1,1,1]] +m_1 = Matrix(my_list_1) +m_2 = Matrix(my_list_1) +sum_m = m_1 + m_2 +sum_m_2 = Matrix(my_list_2)+Matrix(my_list_2) # сложение матриц не квадратных + +print(m_1) +print(m_1.size) + +print(sum_m) +print(sum_m.size) + +print(sum_m_2) +print(sum_m_2.size) + +try: + sum_m_3 = Matrix(my_list_1) + Matrix(my_list_2) # сложение матриц разного размера + +except ValueError as exp: + print(exp) +else: + print(sum_m_3) + print(sum_m_3.size) diff --git a/less-07/task-02.py b/less-07/task-02.py new file mode 100644 index 0000000..4c2eaaf --- /dev/null +++ b/less-07/task-02.py @@ -0,0 +1,57 @@ +# Реализовать проект расчёта суммарного расхода ткани на производство одежды. Основная сущность (класс) этого +# проекта — одежда, которая может иметь определённое название. К типам одежды в этом проекте относятся пальто +# и костюм. У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). Это могут быть +# обычные числа: V и H, соответственно. +# Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + 0.5), для +# костюма (2*H + 0.3). Проверить работу этих методов на реальных данных. +# Реализовать общий подсчет расхода ткани. Проверить на практике полученные на этом уроке знания: реализовать +# абстрактные классы для основных классов проекта, проверить на практике работу декоратора @property. +# + +from abc import ABC, abstractmethod + +class Clotnes(ABC): + count_material = 0 + + @abstractmethod + def consum(self): + pass + +class Coat(Clotnes): + def __init__(self, size): + self.size = size + Coat.count_material += self.consum # в родительский клас складывает все расходы ткани + + def __str__(self): + return f'Пальто: размер {self.size}, требует ткани {self.consum:.2f}' + + @property + def consum(self): + return self.size / 6.5 + 0.5 + +class Costume(Clotnes): + def __init__(self, height): + self.height = height + Costume.count_material += self.consum # в родительский клас складывает все расходы ткани + + def __str__(self): + return f'Костюм: рост {self.height}, требует ткани {self.consum:.2f}' + + @property + def consum(self): + return 2*self.height + 0.3 + + +coat_1 = Coat(36) +print(coat_1) +coat_2 = Coat(42) +print(coat_2) + +costum_1 = Costume(140) +print(costum_1) +costum_2 = Costume(160) +print(costum_2) + +print(f'Расход ткани на пальто составил {coat_1.count_material:.2f}') +print(f'Расход ткани на костюмы составил {costum_2.count_material:.2f}') +print(f'Общий расход ткани {coat_1.count_material+costum_2.count_material:.2f}') diff --git a/less-07/task-03.py b/less-07/task-03.py new file mode 100644 index 0000000..5d450fc --- /dev/null +++ b/less-07/task-03.py @@ -0,0 +1,65 @@ +# Реализовать программу работы с органическими клетками, состоящими из ячеек. Необходимо создать класс Клетка. +# В его конструкторе инициализировать параметр, соответствующий количеству ячеек клетки (целое число). +# В классе должны быть реализованы методы перегрузки арифметических операторов: +# сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()). +# Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, умножение +# и целочисленное (с округлением до целого) деление клеток, соответственно. + +class Cell: + __count = 0 + + def __init__(self, count): + if count <= 0: + raise ValueError("error count <=0") + self.__count = count + + def make_order(self, len_row): + res = ["*" * len_row] * (self.__count // len_row) + if self.__count % len_row: + res.append("*" * (self.__count % len_row)) + return "\n".join(res) + + def __str__(self): + return f'{self.__count}' + + def __add__(self, other): + if not (isinstance(other, Cell)): + raise ValueError("error other class") + return Cell(self.__count + other.__count) + + def __sub__(self, other): + if not (isinstance(other, Cell)): + raise ValueError("error other class") + res = self.__count - other.__count + if res > 0: + return Cell(self.__count - other.__count) + else: + raise ValueError("error defference <=0") + + def __mul__(self, other): + if not (isinstance(other, Cell)): + raise ValueError("error other class") + return Cell(self.__count * other.__count) + + def __floordiv__(self, other): + if not (isinstance(other, Cell)): + raise ValueError("error other class") + #так как Cell иницилизируеться только целым положительным кол-вом ячеек то деления на ноль не будет + #однако при self.__count < other.__count будет иницилизироваться класс нулевым кол-вом ячеек + if (self.__count < other.__count): + raise ValueError("error integer division return zero") + else: + return Cell(self.__count // other.__count) + + + +cell_1 = Cell(12) +cell_2 = Cell(8) +print(cell_1.make_order(5)) +try: + print(f"+ -> {cell_1 + cell_2}") + print(f"- -> {cell_1 - cell_2}") + print(f"* -> {cell_1 * cell_2}") + print(f"/ -> {cell_1 // cell_2}") +except ValueError as exp: + print(exp) \ No newline at end of file