diff --git a/homeworks/les07/task01.py b/homeworks/les07/task01.py new file mode 100644 index 0000000..9f8fbcc --- /dev/null +++ b/homeworks/les07/task01.py @@ -0,0 +1,47 @@ +"""1. Реализовать класс Matrix (матрица). +Обеспечить перегрузку конструктора класса (метод __init__()), +который должен принимать данные (список списков) для формирования матрицы. Подсказка: матрица — система некоторых +математических величин, расположенных в виде прямоугольной схемы. Примеры матриц вы найдете в методичке. +Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix (двух матриц). +Результатом сложения должна быть новая матрица. +Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки +первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. """ +import itertools + + +class Matrix: + data = [[]] # матрица как список строк + + def __init__(self, matrix_row_col): + self.data = matrix_row_col + + def __str__(self): + + buf = '' + pos = len(str(max(itertools.chain(*self.data)))) + 1 + for row in self.data: + for el in row: + buf += f'{el:{pos}}' + buf += '\n' + return buf + + def __add__(self, other): + r_list = [] + for r_idx in range(len(self.data)): + c_list = [] + for c_idx in range(len(self.data[0])): + c_list.append(self.data[r_idx][c_idx] + other.data[r_idx][c_idx]) + r_list.append(c_list) + return Matrix(r_list) + + +if __name__ == '__main__': + m = Matrix([[145, 2, 3], [4, 665, 6]]) + print(m) + m1 = Matrix([[10, 20], [23333, 90]]) + print(m1) + m2 = Matrix([[10, 200], [30, 24]]) + print(m2) + m3 = m1 + m2 + print(m3) diff --git a/homeworks/les07/task02.py b/homeworks/les07/task02.py new file mode 100644 index 0000000..7802bc9 --- /dev/null +++ b/homeworks/les07/task02.py @@ -0,0 +1,45 @@ +"""2. Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная сущность (класс) этого +проекта — одежда, которая может иметь определенное название. К типам одежды в этом проекте относятся пальто и костюм. +У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). Это могут быть обычные числа: V и +H, соответственно. Для определения расхода ткани по каждому типу одежды использовать формулы: +для пальто (V/6.5 +0.5), +для костюма (2 * H + 0.3). +Проверить работу этих методов на реальных данных. Реализовать общий подсчет расхода +ткани. Проверить на практике полученные на этом уроке знания: реализовать абстрактные классы для основных классов +проекта, проверить на практике работу декоратора @property. """ + +from abc import abstractmethod + + +class Clothes: + def __init__(self, name, size): + self.name = name + self.size = size + + @abstractmethod + def outgo(self): + pass + + +class Coat(Clothes): + @property + def outgo(self): + return round(self.size / 6.5 + 0.5, 2) + + +class Suite(Clothes): + @property + def outgo(self): + return round(2 * self.size + 0.3, 2) + + +if __name__ == '__main__': + kk_suit = Suite('KKlain', 48) + hs_suit = Suite('Henderson', 50) + hs_coat = Coat('Heresis', 44) + ga_coat = Coat('Gloverall', 46) + + print(kk_suit.outgo) + print(hs_suit.outgo) + print(hs_coat.outgo) + print(ga_coat.outgo) diff --git a/homeworks/les07/task03.py b/homeworks/les07/task03.py new file mode 100644 index 0000000..95f5ed7 --- /dev/null +++ b/homeworks/les07/task03.py @@ -0,0 +1,104 @@ +"""3. Реализовать программу работы с органическими клетками. Необходимо создать класс Клетка. В его конструкторе +инициализировать параметр, соответствующий количеству клеток (целое число). В классе должны быть реализованы методы +перегрузки арифметических операторов: +сложение (__add__()), вычитание (__sub__()), умножение (__mul__()),деление (__truediv__()). +Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, +умножение и обычное (не целочисленное) деление клеток, соответственно. +В методе деления должно осуществляться округление значения до целого числа. +Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. +Вычитание. Участвуют две клетки. +Операцию необходимо выполнять только если разность количества ячеек двух клеток больше нуля, +иначе выводить соответствующее сообщение. +Умножение. +Создается общая клетка из двух. Число ячеек общей клетки определяется как произведение количества ячеек этих двух +клеток. +Деление. Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление +количества ячеек этих двух клеток. +В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и +количество ячеек в ряду. Данный метод позволяет организовать ячейки по рядам. Метод должен возвращать строку вида +*****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу. Если ячеек на формирование ряда не +хватает, то в последний ряд записываются все оставшиеся. Например, количество ячеек клетки равняется 12, количество +ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n**. Или, количество ячеек клетки равняется +15, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n*****. Подсказка: подробный +список операторов для перегрузки доступен по ссылке. """ + + +class Cell: + def __init__(self, num_units): + if num_units > 0: + self.num_units = num_units + else: + raise ValueError('Organic creation is not allowed') + + def __add__(self, other): + """ Объединение двух клеток. + При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. + Cell + Cell + :param other: Cell + :return: new Cell + """ + return Cell(self.num_units + other.num_units) + + def __sub__(self, other): + """ Участвуют две клетки. Операцию необходимо выполнять только + если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. + Cell - Cell + :param other: Cell + :return: new Cell + """ + difference = self.num_units - other.num_units + + if difference > 0: + return Cell(difference) + else: + raise ValueError('Organic operation is not allowed') + + def __mul__(self, other): + """ Создается общая клетка из двух. + Число ячеек общей клетки определяется как произведение количества ячеек этих двух клеток. + :param other: + :return: + """ + return Cell(self.num_units * other.num_units) + + def __truediv__(self, other): + """ Создается общая клетка из двух. + Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток. + :param other: + :return: + """ + division = self.num_units // other.num_units + if division > 0: + return Cell(division) + else: + raise ValueError('Organic operation is not allowed') + + def make_order(self, num_el): + # соединить сгенерированные части плюс остаток + return '\n'.join(['n' * num_el for _ in range(self.num_units // num_el)] + ['n' * (self.num_units % num_el)]) + + +if __name__ == '__main__': + cols = 10 + + c1 = Cell(15) + print('Cell(15)') + print(c1.make_order(cols)) + + c2 = Cell(12) + print('Cell(12)') + print(c2.make_order(cols)) + + c3 = c1 + c2 + print('Cell(15) + Cell(12)') + print(c3.make_order(cols)) + + c3 = c1 - c2 + print('Cell(15) - Cell(12)') + print(c3.make_order(cols)) + + c3 = c1 / c2 + print('Cell(15) / Cell(12)') + print(c3.make_order(cols)) + + c3 = c2 - c1