diff --git a/.idea/misc.xml b/.idea/misc.xml index 0749876..2849f27 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/.idea/pythoncourse.iml b/.idea/pythoncourse.iml index 8437fe6..f63fa7b 100644 --- a/.idea/pythoncourse.iml +++ b/.idea/pythoncourse.iml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/Lesson 7/Task 2.py b/Lesson 7/Task 2.py new file mode 100644 index 0000000..8d3e62b --- /dev/null +++ b/Lesson 7/Task 2.py @@ -0,0 +1,70 @@ +# 2) Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная +# сущность (класс) этого проекта — одежда, которая может иметь определенное название. К +# типам одежды в этом проекте относятся пальто и костюм. У этих типов одежды существуют +# параметры: размер (для пальто) и рост (для костюма). Это могут быть обычные числа: V и +# H, соответственно. +# Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто +# (V/6.5 + 0.5), для костюма (2*H + 0.3). Проверить работу этих методов на реальных данных. +# Реализовать общий подсчет расхода ткани. Проверить на практике полученные на этом уроке +# знания: реализовать абстрактные классы для основных классов проекта, проверить на +# практике работу декоратора @property +from abc import ABC, abstractmethod + + +class Clothes(ABC): + name = '' + units = [] + + def add_unit(self, unit): + self.units.append(unit) + + @abstractmethod + def requrement(self): + pass + + def __str__(self): + return self.name + + @property + def calc_requrements(self): + total = 0 + for el in self.units: + print(f'Для {el.name} требуется {el.requrement()} ткани') + total += el.requrement() + return f'Всего требуется {total} ткани' + + +class Coat(Clothes): + size = 0 + + def __init__(self, size): + self.name = 'Пальто' + self.size = size + super().add_unit(self) + + def requrement(self): + return self.size / 6.5 + 0.5 + + +class Suit(Clothes): + height = 0 + + def __init__(self, height): + self.name = 'Костюм' + self.height = height + super().add_unit(self) + + def requrement(self): + return 2 * self.height + 0.3 + + +coat1 = Coat(65) +suit1 = Suit(20) + +print(coat1) +print(coat1.requrement()) + +print(suit1) + +print(Clothes.units) +print(coat1.calc_requrements) diff --git a/Lesson 7/Task 3.py b/Lesson 7/Task 3.py new file mode 100644 index 0000000..538a16d --- /dev/null +++ b/Lesson 7/Task 3.py @@ -0,0 +1,82 @@ +# 3) Реализовать программу работы с органическими клетками, состоящими из ячеек. Необходимо +# создать класс Клетка. В его конструкторе инициализировать параметр, соответствующий +# количеству ячеек клетки (целое число). В классе должны быть реализованы методы +# © geekbrains.ru 20 +# перегрузки арифметических операторов: сложение (__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, cells=0): + self._cells_count = cells + self._cells_row = 7 + self._cell_struct = [] + self._construct_cell() + + def __add__(self, other): + return Cell(self._cells_count + other._cells_count) + + def __sub__(self, other): + if self._cells_count - other._cells_count <= 0: + raise TypeError('Операция не возможна') + else: + return Cell(self._cells_count - other._cells_count) + + def __mul__(self, other): + return Cell(self._cells_count * other._cells_count) + + def __truediv__(self, other): + if other._cells_count == 0: + raise ZeroDivisionError('Операция не возможна') + else: + return Cell(self._cells_count // other._cells_count) + + def make_order(self, cell_row): + self._cells_row = cell_row + self._construct_cell() + + def _construct_cell(self): + self._cell_struct.clear() + cell_parts = self._cells_count / self._cells_row if self._cells_count % self._cells_row == 0 else ( + self._cells_count // self._cells_row) + 1 + for i in range(int(cell_parts)): + mesh = self._cells_row if self._cells_count - self._cells_row * ( + i) > self._cells_row else self._cells_count - self._cells_row * (i) + self._cell_struct.append(mesh * '*') + + def __str__(self): + return '\n'.join(self._cell_struct) + + +my_cell1 = Cell(7) + +my_cell2 = Cell(0) + +print('Клетка 1') +print(my_cell1) +print('Клетка 2') +print(my_cell2) + +my_cell3 = my_cell1 / my_cell2 +my_cell3.make_order(4) +print('Клетка 3') +print(my_cell3) diff --git a/Lesson 7/Task_1.py b/Lesson 7/Task_1.py new file mode 100644 index 0000000..395d861 --- /dev/null +++ b/Lesson 7/Task_1.py @@ -0,0 +1,61 @@ +# 1) Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод +# __init__()), который должен принимать данные (список списков) для формирования матрицы. +# Подсказка: матрица — система некоторых математических величин, расположенных в виде +# прямоугольной схемы. +# Примеры матриц: 3 на 2, 3 на 3, 2 на 4. +# 31 22 +# 37 43 +# 51 86 +# 3 5 32 +# 2 4 6 +# -1 64 -8 +# 3 5 8 3 +# 8 3 7 1 +# Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в +# привычном виде. +# Далее реализовать перегрузку метода __add__() для реализации операции сложения двух +# объектов класса Matrix (двух матриц). Результатом сложения должна быть новая матрица. +# Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой +# строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. + +import numpy as np + + +class Matrix: + _sub_matrix = [] + + def __init__(self, user_matrix): + self.sub_matrix = user_matrix + + def __str__(self): + print(*self.sub_matrix, sep='\n') + + def validate_matrix(self, other): + if len(self.sub_matrix) != len(other.sub_matrix): + return False + else: + for i in range(len(self.sub_matrix)): + if len(self.sub_matrix[i]) != len(other.sub_matrix[i]): + return False + return True + + + def __add__(self, other): + if self.validate_matrix(other): + return np.array(self.sub_matrix) + np.array(other.sub_matrix) + else: + return 'Сложить можно только матрицы одного размера' + + +user_list1 = [[1, 2], [3, 4]] +user_list2 = [[5, 6], [7, 8]] + +user_matrix1 = Matrix(user_list1) +user_matrix2 = Matrix(user_list2) + +user_matrix1.__str__() +user_matrix2.__str__() + +user_matrix1.__add__(user_matrix2) + +print(user_matrix1.__add__(user_matrix2))