From c11b5691c2aa73c3b04ccbea4c93f306de404f3d Mon Sep 17 00:00:00 2001 From: Alex Klyanchin Date: Thu, 5 Nov 2020 09:48:27 +0300 Subject: [PATCH 1/5] les07 initial --- homeworks/les07/task01.py | 9 +++++++++ homeworks/les07/task02.py | 7 +++++++ homeworks/les07/task03.py | 17 +++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 homeworks/les07/task01.py create mode 100644 homeworks/les07/task02.py create mode 100644 homeworks/les07/task03.py diff --git a/homeworks/les07/task01.py b/homeworks/les07/task01.py new file mode 100644 index 0000000..2ab9b8d --- /dev/null +++ b/homeworks/les07/task01.py @@ -0,0 +1,9 @@ +"""1. Реализовать класс Matrix (матрица). +Обеспечить перегрузку конструктора класса (метод __init__()), +который должен принимать данные (список списков) для формирования матрицы. Подсказка: матрица — система некоторых +математических величин, расположенных в виде прямоугольной схемы. Примеры матриц вы найдете в методичке. +Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix (двух матриц). +Результатом сложения должна быть новая матрица. +Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки +первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. """ diff --git a/homeworks/les07/task02.py b/homeworks/les07/task02.py new file mode 100644 index 0000000..f4bff29 --- /dev/null +++ b/homeworks/les07/task02.py @@ -0,0 +1,7 @@ +"""2. Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная сущность (класс) этого +проекта — одежда, которая может иметь определенное название. К типам одежды в этом проекте относятся пальто и костюм. +У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). Это могут быть обычные числа: V и +H, соответственно. Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + +0.5), для костюма (2 * H + 0.3). Проверить работу этих методов на реальных данных. Реализовать общий подсчет расхода +ткани. Проверить на практике полученные на этом уроке знания: реализовать абстрактные классы для основных классов +проекта, проверить на практике работу декоратора @property. """ \ No newline at end of file diff --git a/homeworks/les07/task03.py b/homeworks/les07/task03.py new file mode 100644 index 0000000..92fccc0 --- /dev/null +++ b/homeworks/les07/task03.py @@ -0,0 +1,17 @@ +"""3. Реализовать программу работы с органическими клетками. Необходимо создать класс Клетка. В его конструкторе +инициализировать параметр, соответствующий количеству клеток (целое число). В классе должны быть реализованы методы +перегрузки арифметических операторов: сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), +деление (__truediv__()).Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, +умножение и обычное (не целочисленное) деление клеток, соответственно. В методе деления должно осуществляться +округление значения до целого числа. Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно +равняться сумме ячеек исходных двух клеток. Вычитание. Участвуют две клетки. Операцию необходимо выполнять только +если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. Умножение. +Создается общая клетка из двух. Число ячеек общей клетки определяется как произведение количества ячеек этих двух +клеток. Деление. Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление +количества ячеек этих двух клеток. В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и +количество ячеек в ряду. Данный метод позволяет организовать ячейки по рядам. Метод должен возвращать строку вида +*****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу. Если ячеек на формирование ряда не +хватает, то в последний ряд записываются все оставшиеся. Например, количество ячеек клетки равняется 12, количество +ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n**. Или, количество ячеек клетки равняется +15, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n*****. Подсказка: подробный +список операторов для перегрузки доступен по ссылке. """ \ No newline at end of file From fc5faa2e9eceecd2ab228e6bb2f2ab132b9cf73a Mon Sep 17 00:00:00 2001 From: Alex Klyanchin Date: Thu, 5 Nov 2020 21:01:43 +0300 Subject: [PATCH 2/5] les07 task01 --- homeworks/les07/task01.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/homeworks/les07/task01.py b/homeworks/les07/task01.py index 2ab9b8d..650e8d0 100644 --- a/homeworks/les07/task01.py +++ b/homeworks/les07/task01.py @@ -7,3 +7,23 @@ Результатом сложения должна быть новая матрица. Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. """ + + +class Matrix: + data = [[]] + + def __init__(self, rowcol): + self.data = rowcol + + def __str__(self): + buf = '' + for row in self.data: + for el in row: + buf += f'{el:5}' + buf += '\n' + return buf + + +if __name__ == '__main__': + m = Matrix([[145.7, 2, 3], [4, 665, 6.4]]) + print(m) From 60914900478e03d4d426f3ca0e3896b8605bc797 Mon Sep 17 00:00:00 2001 From: Alex Klyanchin Date: Thu, 5 Nov 2020 23:58:37 +0300 Subject: [PATCH 3/5] les07 task01 --- homeworks/les07/task01.py | 19 +++++++++++++++-- homeworks/les07/task02.py | 44 ++++++++++++++++++++++++++++++++++++--- homeworks/les07/task03.py | 22 +++++++++++++------- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/homeworks/les07/task01.py b/homeworks/les07/task01.py index 650e8d0..6514a03 100644 --- a/homeworks/les07/task01.py +++ b/homeworks/les07/task01.py @@ -12,8 +12,8 @@ class Matrix: data = [[]] - def __init__(self, rowcol): - self.data = rowcol + def __init__(self, matrix_row_col): + self.data = matrix_row_col def __str__(self): buf = '' @@ -23,7 +23,22 @@ def __str__(self): 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.7, 2, 3], [4, 665, 6.4]]) print(m) + m1 = Matrix([[10, 20], [233, 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 index f4bff29..7802bc9 100644 --- a/homeworks/les07/task02.py +++ b/homeworks/les07/task02.py @@ -1,7 +1,45 @@ """2. Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная сущность (класс) этого проекта — одежда, которая может иметь определенное название. К типам одежды в этом проекте относятся пальто и костюм. У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). Это могут быть обычные числа: V и -H, соответственно. Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + -0.5), для костюма (2 * H + 0.3). Проверить работу этих методов на реальных данных. Реализовать общий подсчет расхода +H, соответственно. Для определения расхода ткани по каждому типу одежды использовать формулы: +для пальто (V/6.5 +0.5), +для костюма (2 * H + 0.3). +Проверить работу этих методов на реальных данных. Реализовать общий подсчет расхода ткани. Проверить на практике полученные на этом уроке знания: реализовать абстрактные классы для основных классов -проекта, проверить на практике работу декоратора @property. """ \ No newline at end of file +проекта, проверить на практике работу декоратора @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 index 92fccc0..686ae85 100644 --- a/homeworks/les07/task03.py +++ b/homeworks/les07/task03.py @@ -1,14 +1,20 @@ """3. Реализовать программу работы с органическими клетками. Необходимо создать класс Клетка. В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число). В классе должны быть реализованы методы -перегрузки арифметических операторов: сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), -деление (__truediv__()).Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, -умножение и обычное (не целочисленное) деление клеток, соответственно. В методе деления должно осуществляться -округление значения до целого числа. Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно -равняться сумме ячеек исходных двух клеток. Вычитание. Участвуют две клетки. Операцию необходимо выполнять только -если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. Умножение. +перегрузки арифметических операторов: +сложение (__add__()), вычитание (__sub__()), умножение (__mul__()),деление (__truediv__()). +Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, +умножение и обычное (не целочисленное) деление клеток, соответственно. +В методе деления должно осуществляться округление значения до целого числа. +Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. +Вычитание. Участвуют две клетки. +Операцию необходимо выполнять только если разность количества ячеек двух клеток больше нуля, +иначе выводить соответствующее сообщение. +Умножение. Создается общая клетка из двух. Число ячеек общей клетки определяется как произведение количества ячеек этих двух -клеток. Деление. Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление -количества ячеек этих двух клеток. В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и +клеток. +Деление. Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление +количества ячеек этих двух клеток. +В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и количество ячеек в ряду. Данный метод позволяет организовать ячейки по рядам. Метод должен возвращать строку вида *****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу. Если ячеек на формирование ряда не хватает, то в последний ряд записываются все оставшиеся. Например, количество ячеек клетки равняется 12, количество From 0cca33dad2dea718ab3315b93707243a0b5260cd Mon Sep 17 00:00:00 2001 From: Alex Klyanchin Date: Fri, 6 Nov 2020 17:38:07 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=B4=D1=83=D1=8B07=20=D0=B5=D1=84=D1=8B?= =?UTF-8?q?=D0=BB03=20=D1=88=D1=82=D1=88=D0=B5=D1=88=D1=84=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homeworks/les07/task03.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/homeworks/les07/task03.py b/homeworks/les07/task03.py index 92fccc0..a0456f1 100644 --- a/homeworks/les07/task03.py +++ b/homeworks/les07/task03.py @@ -14,4 +14,36 @@ хватает, то в последний ряд записываются все оставшиеся. Например, количество ячеек клетки равняется 12, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n**. Или, количество ячеек клетки равняется 15, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n*****. Подсказка: подробный -список операторов для перегрузки доступен по ссылке. """ \ No newline at end of file +список операторов для перегрузки доступен по ссылке. """ + +class Cell: + def __init__(self, num_units): + self.num_units = num_units + def __add__(self, other): + """ Объединение двух клеток. + При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. + :param other: + :return: + """ + pass + def __sub__(self, other): + """ Участвуют две клетки. Операцию необходимо выполнять только + если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. + :param other: + :return: + """ + pass + def __mul__(self, other): + """ Создается общая клетка из двух. + Число ячеек общей клетки определяется как произведение количества ячеек этих двух клеток. + :param other: + :return: + """ + pass + def __truediv__(self, other): + """ Создается общая клетка из двух. + Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток. + :param other: + :return: + """ + pass From 80bb5c3d149ec2cc0fc8bf5ec15d16fa83a9364c Mon Sep 17 00:00:00 2001 From: Alex Klyanchin Date: Sun, 8 Nov 2020 14:01:56 +0300 Subject: [PATCH 5/5] les07 final --- homeworks/les07/task01.py | 11 ++++--- homeworks/les07/task03.py | 67 +++++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/homeworks/les07/task01.py b/homeworks/les07/task01.py index 6514a03..9f8fbcc 100644 --- a/homeworks/les07/task01.py +++ b/homeworks/les07/task01.py @@ -7,19 +7,22 @@ Результатом сложения должна быть новая матрица. Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. """ +import itertools class Matrix: - data = [[]] + 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:5}' + buf += f'{el:{pos}}' buf += '\n' return buf @@ -34,9 +37,9 @@ def __add__(self, other): if __name__ == '__main__': - m = Matrix([[145.7, 2, 3], [4, 665, 6.4]]) + m = Matrix([[145, 2, 3], [4, 665, 6]]) print(m) - m1 = Matrix([[10, 20], [233, 90]]) + m1 = Matrix([[10, 20], [23333, 90]]) print(m1) m2 = Matrix([[10, 200], [30, 24]]) print(m2) diff --git a/homeworks/les07/task03.py b/homeworks/les07/task03.py index 7a2a5c7..95f5ed7 100644 --- a/homeworks/les07/task03.py +++ b/homeworks/les07/task03.py @@ -22,34 +22,83 @@ 15, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n*****. Подсказка: подробный список операторов для перегрузки доступен по ссылке. """ + class Cell: def __init__(self, num_units): - self.num_units = num_units + if num_units > 0: + self.num_units = num_units + else: + raise ValueError('Organic creation is not allowed') + def __add__(self, other): """ Объединение двух клеток. При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. - :param other: - :return: + Cell + Cell + :param other: Cell + :return: new Cell """ - pass + return Cell(self.num_units + other.num_units) + def __sub__(self, other): """ Участвуют две клетки. Операцию необходимо выполнять только если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. - :param other: - :return: + Cell - Cell + :param other: Cell + :return: new Cell """ - pass + 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: """ - pass + return Cell(self.num_units * other.num_units) + def __truediv__(self, other): """ Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток. :param other: :return: """ - pass + 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