This commit is contained in:
denis-on 2022-03-30 20:16:55 +03:00
parent 47635b551a
commit 4d091e3c06
3 changed files with 173 additions and 0 deletions

51
less-07/task-01.py Normal file
View File

@ -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)

57
less-07/task-02.py Normal file
View File

@ -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}')

65
less-07/task-03.py Normal file
View File

@ -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)