From 8e8932253106ac65bfdce7011da71bd766e2d350 Mon Sep 17 00:00:00 2001 From: Rene-bool <56275019+Rene-bool@users.noreply.github.com> Date: Sun, 27 Oct 2019 21:43:13 +0400 Subject: [PATCH 1/3] Add files via upload --- 06_hw_01.py | 27 ++++++++++++ 06_hw_02.py | 20 +++++++++ 06_hw_03.py | 36 ++++++++++++++++ 06_hw_04.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 06_hw_05.py | 41 ++++++++++++++++++ 5 files changed, 241 insertions(+) create mode 100644 06_hw_01.py create mode 100644 06_hw_02.py create mode 100644 06_hw_03.py create mode 100644 06_hw_04.py create mode 100644 06_hw_05.py diff --git a/06_hw_01.py b/06_hw_01.py new file mode 100644 index 0000000..5d5f648 --- /dev/null +++ b/06_hw_01.py @@ -0,0 +1,27 @@ +# 1) Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) и метод +# running (запуск). Атрибут реализовать как приватный. В рамках метода реализовать +# переключение светофора в режимы: красный, желтый, зеленый. Время перехода между +# режимами должно составлять 7 и 2 секунды. Проверить работу примера, создав экземпляр и +# вызвав описанный метод. + +import time + + +class TrafficLight: + # __color = 'color' + + def t_running(self): + i = 7 + j = 2 + self.__color = 'Red' + print(self.__color) + time.sleep(i) # in seconds + self.__color = 'Yellow' + print(self.__color) + time.sleep(j) # in seconds + self.__color = 'Green' + print(self.__color) + + +t = TrafficLight() +t.t_running() diff --git a/06_hw_02.py b/06_hw_02.py new file mode 100644 index 0000000..67e6e83 --- /dev/null +++ b/06_hw_02.py @@ -0,0 +1,20 @@ +# 2) Реализовать класс Road (дорога), в котором определить атрибуты: length (длина), width +# (ширина). Значения данных атрибутов должны передаваться при создании экземпляра класса. +# Атрибуты сделать защищенными. Определить метод расчета массы асфальта, необходимого +# для покрытия всего дорожного полотна. Использовать формулу: длина*ширина*масса +# асфальта для покрытия одного кв метра дороги асфальтом, толщиной в 1 см*число см +# толщины полотна. Проверить работу метода. +# Например: 20м*5000м*25кг*5см = 12500 т + + +class Road: + def mass_calc(self, _length, _width): + self._width = _width + self._length = _length + asp_mass = self._length * self._width * 25 * 1 / 1000 + print(f'Масса асфальта для укладки толщиной 1 см составляет {asp_mass} т') + + +m = Road() +m.mass_calc(20, 5000) + diff --git a/06_hw_03.py b/06_hw_03.py new file mode 100644 index 0000000..8eedd0a --- /dev/null +++ b/06_hw_03.py @@ -0,0 +1,36 @@ +# 3) Реализовать базовый класс Worker (работник), в котором определить атрибуты: name , +# surname , position (должность), income (доход). Последний атрибут должен быть +# защищенным и ссылаться на словарь, содержащий элементы: оклад и премия, например, +# {"profit": profit, "bonus": bonus}. Создать класс Position (должность) на базе класса Worker . +# В классе Position реализовать методы получения полного имени сотрудника ( get_full_name ) и +# дохода с учетом премии ( get_full_profit) . Проверить работу примера на реальных данных +# (создать экземпляры класса Position , передать данные, проверить значения атрибутов, +# вызвать методы экземпляров). + + +class Worker: + def __init__(self, name, surname, position, profit, bonus): + self.name = name + self.surname = surname + self.position = position + self._income = {"profit": profit, "bonus": bonus} + + +class Position(Worker): + def __init__(self, name, surname, position, profit, bonus): + super().__init__(name, surname, position, profit, bonus) + + def get_full_name(self, name, surname): + self.name = name + self.surname = surname + + def get_full_profit(self, _income): + pass + # self.profit = profit + # self.bonus = bonus + self._income = _income + + +n = Position('Ivan', 'Novak', 'CEO', 10000, 3000) +print(n.name + ' ' + n.surname) +print(n._income) diff --git a/06_hw_04.py b/06_hw_04.py new file mode 100644 index 0000000..1f559dd --- /dev/null +++ b/06_hw_04.py @@ -0,0 +1,117 @@ +# 4) Опишите несколько классов: TownCar , SportCar , WorkCar , PoliceCar . У каждого класса +# должны быть следующие атрибуты: speed , color , name , is_police (булево). А также несколько +# методов: go , stop , turn(direction) , которые должны сообщать, что машина поехала, +# остановилась, повернула (куда). + + +class TownCar: + speed = 60 + color = 'Yellow' + name = 'Cabby' + is_police = False + + def go(self): + print(f"Автомобиль {self.name} начал движение") + + def stop(self): + print(f"Автомобиль {self.name} остановился") + + def turn(self, turn_angle): + self.turn_angle = turn_angle + if self.turn_angle > 0: + print(f"Автомобиль {self.name} повернул налево") + elif self.turn_angle < 0: + print(f"Автомобиль {self.name} повернул направо") + else: + print(f"Автомобиль {self.name} движется прямо") + + +class SportCar: + speed = 380 + color = 'Red' + name = 'Sport Car' + is_police = False + + def go(self): + print(f"Автомобиль {self.name} начал движение") + + def stop(self): + print(f"Автомобиль {self.name} остановился") + + def turn(self, turn_angle): + self.turn_angle = turn_angle + if self.turn_angle > 0: + print(f"Автомобиль {self.name} повернул налево") + elif self.turn_angle < 0: + print(f"Автомобиль {self.name} повернул направо") + else: + print(f"Автомобиль {self.name} движется прямо") + + +class WorkCar: + speed = 40 + color = 'Grey' + name = 'Worker' + is_police = False + + def go(self): + print(f"Автомобиль {self.name} начал движение") + + def stop(self): + print(f"Автомобиль {self.name} остановился") + + def turn(self, turn_angle): + self.turn_angle = turn_angle + if self.turn_angle > 0: + print(f"Автомобиль {self.name} повернул налево") + elif self.turn_angle < 0: + print(f"Автомобиль {self.name} повернул направо") + else: + print(f"Автомобиль {self.name} движется прямо") + + +class PoliceCar: + speed = 180 + color = 'Black' + name = 'Officer' + is_police = True + + def go(self): + print(f"Автомобиль {self.name} начал движение") + + def stop(self): + print(f"Автомобиль {self.name} остановился") + + def turn(self, turn_angle): + self.turn_angle = turn_angle + if self.turn_angle > 0: + print(f"Автомобиль {self.name} повернул налево") + elif self.turn_angle < 0: + print(f"Автомобиль {self.name} повернул направо") + else: + print(f"Автомобиль {self.name} движется прямо") + + +t = TownCar() +t.go() +t.turn(10) +t.turn(-10) +t.stop() + +s = SportCar() +s.go() +s.turn(10) +s.turn(-10) +s.stop() + +w = WorkCar() +w.go() +w.turn(10) +w.turn(-10) +w.stop() + +p = PoliceCar() +p.go() +p.turn(10) +p.turn(-10) +p.stop() diff --git a/06_hw_05.py b/06_hw_05.py new file mode 100644 index 0000000..f212533 --- /dev/null +++ b/06_hw_05.py @@ -0,0 +1,41 @@ +# 5) Реализовать класс Stationery (канцелярская принадлежность). Определить в нем атрибут title +# (название) и метод draw (отрисовка). Метод выводит сообщение “Запуск отрисовки.” Создать +# три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер). В каждом из классов +# реализовать переопределение метода draw . Для каждого из классов методы должен +# выводить уникальное сообщение. Создать экземпляры классов и проверить, что выведет +# описанный метод для каждого экземпляра. + + +class Stationery: + title = 'Stationery' + + def draw(self): + print(f"Запуск отрисовки") + + +class Pen(Stationery): + + def draw(self): + print(f"Запуск отрисовки Ручки") + + +class Pencil(Stationery): + + def draw(self): + print(f"Запуск отрисовки Карандаша") + + +class Handle(Stationery): + + def draw(self): + print(f"Запуск отрисовки Маркера") + + +p = Pen() +p.draw() + +pl = Pencil() +pl.draw() + +h = Handle() +h.draw() From 1791ba3f64313298cff974cc07751af6cc488f5b Mon Sep 17 00:00:00 2001 From: Rene-bool <56275019+Rene-bool@users.noreply.github.com> Date: Thu, 31 Oct 2019 16:27:42 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B8=D0=BB=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=202=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) Первую задачу сделал +/-. Код вроде работает и складывает матрицы, но в консоли дает ошибки type NoneType. Не пойму что нужно добавить или что лишнее убрать. Наставник подсказал как довести до ума, но я не до конца разобрался в его коде. 2) По второй вроде не осталось вопросов. 3) Третью не осилил. Пока тяжело даются классы, перегрузки методов. --- 07-hw-01-2.py | 40 ++++++++++++++++++++++++++++++++++++++++ 07-hw-01.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 07-hw-02.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 07-hw-01-2.py create mode 100644 07-hw-01.py create mode 100644 07-hw-02.py diff --git a/07-hw-01-2.py b/07-hw-01-2.py new file mode 100644 index 0000000..120b2bf --- /dev/null +++ b/07-hw-01-2.py @@ -0,0 +1,40 @@ +# 1) Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод +# __init__() ), который должен принимать данные (список списков) для формирования матрицы. +# Подсказка: матрица — система некоторых математических величин, расположенных в виде +# прямоугольной схемы. +# Примеры матриц: 3 на 2, 3 на 3, 2 на 4. +# 31 22 | 3 5 32 | 3 5 8 3 +# 37 43 | 2 4 6 | 8 3 7 1 +# 51 86 | -1 64 -8 | +# Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в +# привычном виде. +# Далее реализовать перегрузку метода __add__() для реализации операции сложения двух +# объектов класса Matrix (двух матриц). Результатом сложения должна быть новая матрица. +# Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой +# строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. +# [[31, 22], [37, 43], [51, 86]] + + +class Matrix: + + def __init__(self, matrix): + self.matrix = matrix + + def __str__(self): + return '\n'.join([''.join(['%d\t' % i for i in row]) for row in self.matrix]) + + def __add__(self, matrix2): + m_sum = [[self.matrix[i][j] + matrix2.matrix[i][j] for j, item in enumerate(matrix)] for i, matrix in + enumerate(self.matrix)] + return Matrix(m_sum) + + +m_list1 = [[11, 22], [33, 44], [55, 66]] +m_list2 = [[66, 55], [44, 33], [22, 11]] +mm1 = Matrix(m_list1) +mm2 = Matrix(m_list2) +print(mm1, '\n') +print(mm2, '\n') + +# mm.__str__() +print(mm1 + mm2) diff --git a/07-hw-01.py b/07-hw-01.py new file mode 100644 index 0000000..8e98db4 --- /dev/null +++ b/07-hw-01.py @@ -0,0 +1,49 @@ +# 1) Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод +# __init__() ), который должен принимать данные (список списков) для формирования матрицы. +# Подсказка: матрица — система некоторых математических величин, расположенных в виде +# прямоугольной схемы. +# Примеры матриц: 3 на 2, 3 на 3, 2 на 4. +# 31 22 | 3 5 32 | 3 5 8 3 +# 37 43 | 2 4 6 | 8 3 7 1 +# 51 86 | -1 64 -8 | +# Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в +# привычном виде. +# Далее реализовать перегрузку метода __add__() для реализации операции сложения двух +# объектов класса Matrix (двух матриц). Результатом сложения должна быть новая матрица. +# Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой +# строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. +# [[31, 22], [37, 43], [51, 86]] + + +class Matrix: + + def __init__(self, matrix): + self.matrix = matrix + + def __str__(self): + for el in self.matrix: + print(*el) + print('\n') + + def __add__(self, other): + new_list = [] + self.new_list = new_list + i = 0 + while i < len(self.matrix): + new_list.append([]) + j = 0 + while j < len(self.matrix[i]): + new_list[i].append(self.matrix[i][j] + other.matrix[i][j]) # , self.my_list2 + other.my_list2) + j += 1 + i += 1 + return Matrix(self.new_list) + + +m_list1 = [[11, 22], [33, 44], [55, 66]] +m_list2 = [[66, 55], [44, 33], [22, 11]] +mm1 = Matrix(m_list1) +mm2 = Matrix(m_list2) +mm1.__str__() +mm2.__str__() + +print(mm1 + mm2) diff --git a/07-hw-02.py b/07-hw-02.py new file mode 100644 index 0000000..875e772 --- /dev/null +++ b/07-hw-02.py @@ -0,0 +1,47 @@ +# 2) Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная +# сущность (класс) этого проекта — одежда , которая может иметь определенное название. К +# типам одежды в этом проекте относятся пальто и костюм . У этих типов одежды существуют +# параметры: размер (для пальто ) и рост (для костюма ). Это могут быть обычные числа: V и +# H , соответственно. +# Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто +# (V/6.5 + 0.5) , для костюма (2*H + 0.3) . Проверить работу этих методов на реальных данных. +# Реализовать общий подсчет расхода ткани. Проверить на практике полученные на этом уроке +# знания: реализовать абстрактные классы для основных классов проекта, проверить на +# практике работу декоратора @property . + +# С ПОМОЩЬЮ НАСТАВНИКА + +from abc import ABC, abstractmethod + + +class Clothes(ABC): + @abstractmethod + def __init__(self, name): + self.name = name + + +class Coat(Clothes): + def __init__(self, name, V): + super().__init__(name) + self.V = V + + @property + def mat_calc(self): + return f'Для пошива изделия {self.name} потребуется %.1f ед. материала' % (self.V / 6.5 + 0.5) + + +class Suit(Clothes): + def __init__(self, name, H): + super().__init__(name) + self.H = H + + @property + def mat_calc(self): + return f'Для пошива изделия {self.name} потребуется %.1f ед. материала' % (2 * self.H + 0.3) + + +mat_coat = Coat('Пальто', 150) +print(mat_coat.mat_calc) + +mat_suit = Suit('Костюм', 15) +print(mat_suit.mat_calc) From bd201626343ebc1c880760486dde23b717184fa1 Mon Sep 17 00:00:00 2001 From: Rene-bool <56275019+Rene-bool@users.noreply.github.com> Date: Thu, 31 Oct 2019 22:52:41 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= =?UTF-8?q?=203=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D1=83=207=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 07-hw-03.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 07-hw-03.py diff --git a/07-hw-03.py b/07-hw-03.py new file mode 100644 index 0000000..42d8595 --- /dev/null +++ b/07-hw-03.py @@ -0,0 +1,53 @@ +# 3) Реализовать программу работы с клетками. Необходимо создать класс Клетка. В его +# конструкторе инициализировать параметр, соответствующий количеству клеток (целое число). +# В классе должны быть реализованы методы перегрузки арифметических операторов: +# сложение ( __add__() ), вычитание ( __sub__() ), умножение ( __mul__() ), +# деление ( __truediv__() ). +# Данные методы должны выполнять увеличение, уменьшение, умножение и обычное (не +# целочисленное) деление клеток, соответственно. В методе деления должно осуществляться +# округление значения до целого числа. +# В классе необходимо реализовать метод make_cell() , принимающий экземпляр класса и +# количество клеток в ряду. Метод должен возвращать строку виду *****\n*****\n***** ..., где +# количество клеток между \n равно переданному аргументу, а количество рядов определяется, +# исходя из общего количества клеток. +# При создании экземпляра клетки должна происходить перезапись параметра, который хранит +# количество клеток. + +import math + + +class Cell: + def __init__(self, nums): + self.nums = nums + + def __str__(self): + return f"Число клеток {self.nums}" + + def __add__(self, other): + m_sum = self.nums + other.nums + return Cell(m_sum) + + def __sub__(self, other): + m_sub = self.nums - other.nums + return Cell(m_sub) + + def __mul__(self, other): + m_mul = self.nums * other.nums + return Cell(m_mul) + + def __truediv__(self, other): + m_tdiv = math.ceil(self.nums / other.nums) + return Cell(m_tdiv) + + def make_cell(self, in_row): + return '\n'.join('*' * in_row for el in range(math.floor(self.nums / in_row))) + '\n' + \ + ('*' * (self.nums % in_row)) + + +nms1 = Cell(21) +nms2 = Cell(6) +print(nms1 + nms2) +print(nms1 - nms2) +print(nms1 * nms2) +print(nms1 / nms2) +print(nms1.make_cell(6))