Skip to content
Open
100 changes: 100 additions & 0 deletions 8th hometask/1th task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
from random import randint


# Класс Дата
class Date:
# Словарь для преобразования списка с частями даты в словарь с частями даты
dict_parts_of_date = {
0: 'day',
1: 'month',
2: 'year'
}

# Конструктор: записывает дату из параметра в атрибут объекта
def __init__(self, str_data='01-01-1900'):
dict_date = Date.date_to_numeric(str_data)
dict_date = self.date_validation(dict_date)

for index in Date.dict_parts_of_date.keys():
if dict_date[Date.dict_parts_of_date[index]] is None:
print(f'Object "{str_data}" was not created successfully')
print(f'Part "{Date.dict_parts_of_date[index]}" of "{str_data}" is not correct')
self.dict_date = None
break
else:
self.dict_date = dict_date

if self.dict_date is not None:
print(f'Object "{str_data}" was created successfully')

# Метод Преобразования строчной записи даты в словарь с частями даты
# Принимает в качестве параметра строковую запись даты
# Возвращает словарь с частями дат в формате чисел или значение None в случае невозможности преобразования
@classmethod
def date_to_numeric(cls, str_to_int):
# Строка для промежуточного хранения частей даты через пробел
str_to_int = str_to_int.replace('-', ' ')
# Словарь для хранения чатей дат, туда будет записан результат работы метода
dict_to_int = {}
# Для каждого номера элемента и значения среди списка слов строки (частей даты)
for index, value in enumerate(str_to_int.split()):
# пробовать
try:
# добавить в итоговый словарь с соотвествующим индексом:
# 0 - день
# 1 - месяц
# 2 - год
# преобразованную в число соответствующую часть даты
dict_to_int[cls.dict_parts_of_date.get(index)] = int(value)
# при невозможности преобразования
except ValueError:
# поместить в словарь значение None
dict_to_int[cls.dict_parts_of_date.get(index)] = None
# Вернуть сформированный словарь
return dict_to_int

# Метод Проверки даты
# Принимает в качестве параметра строковую запись даты
@staticmethod
def date_validation(dict_to_validate):
# Пробовать
try:
# оценить часть даты "День"
if dict_to_validate['day'] < 1 or dict_to_validate['day'] > 31:
# в случае некорректного значения убрать значение
dict_to_validate['day'] = None
# в случае невозможности сравнения
except TypeError:
# убрать значение
dict_to_validate['day'] = None

# Аналогичная проверка для части даты "Месяц"
try:
if dict_to_validate['month'] < 1 or dict_to_validate['month'] > 12:
dict_to_validate['month'] = None
except TypeError:
dict_to_validate['month'] = None

# Аналогичная проверка для части даты "Год"
try:
if dict_to_validate['year'] < 1900 or dict_to_validate['year'] > 2100:
dict_to_validate['year'] = None
except TypeError:
dict_to_validate['year'] = None

return dict_to_validate


# Создать объект класса Дата
new_date = Date(f'{randint(1, 30):02}-{randint(1, 12):02}-{randint(1900, 2100)}')
print(new_date.dict_date)

# Создать объект класса Дата с заведомо некорректным годом
print()
new_date_2 = Date(f'01-01-2oo5')
print(new_date_2.dict_date)

# Создать объект класса Дата с заведомо некорректными днём и годом
print()
new_date_3 = Date(f'00-10-2200')
print(new_date_3.dict_date)
75 changes: 75 additions & 0 deletions 8th hometask/2th task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Исключение для обработки деления на нуль
class MyZeroDivision(Exception):
def __init__(self, strange_message):
self.strange_message = strange_message


# Исключение для обработки преобразования строки в число
class MyValueError(Exception):
def __init__(self, another_strange_message):
self.another_strange_message = another_strange_message


# Запрос переменных для деления у пользователя
# var_a - переменная для делимого
# var_b - переменная для делителя
var_a = input(f'Enter some digit to divide it: ')
var_b = input(f'Enter some digit to divide first digit on it: ')

# Попробовать преобразовать значение переменной var_a
try:
# Если значение переменной является числом
if var_a.isdigit():
# преобразовать переменную
var_a = float(var_a)
# иначе
else:
# поднять исключение
raise MyValueError(f'Var_a has not a numeric value')
# Перехватить исключение
except MyValueError as my_value_error_var_a:
# Вывести очень важное сообщение
print(my_value_error_var_a.another_strange_message)
# Завершить программу с аварийным кодом
exit(1)
# Иначе
else:
# Вывести сообщение, что всё хорошо
print(f'Value of var_a successfully became numeric: {var_a}')

# Аналогичный алгоритм для преобзования переменной var_b
try:
if var_b.isdigit():
var_b = float(var_b)
else:
raise MyValueError(f'Var_b has not a numeric value')
except MyValueError as my_value_error_var_b:
print(my_value_error_var_b.another_strange_message)
exit(1)
else:
print(f'Value of var_b successfully became numeric: {var_b}')

# Попробовать выполнить деление
try:
# Если значение делителя равно нулю
if var_b == 0:
# поднять исключение
raise MyZeroDivision(f'Oops, something went wrong! Are you sure you have not tried to divide on zero?')
# иначе
else:
# выполнить деление и сохранить результат в новую переменную
var_division_result = var_a / var_b
# Перехватить исключение
except MyZeroDivision as my_zero_division_result:
# Вывести ещё более важное сообщение
print(my_zero_division_result.strange_message)
# Завершить программу с аварийным кодом
exit(1)
# Иначе
else:
# Вывести сообщение с результатом деления
print(f'Here is the result: {var_division_result}')
# в конце
finally:
# Вывести сообщение, что программа звершила работу штатно
print(f'Program has finished properly')
43 changes: 43 additions & 0 deletions 8th hometask/3th task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Исключение для ловли символов, претворяющихся числами
class MyStrangeException(Exception):
def __init__(self, strange_message):
self.strange_message = strange_message


# Список для хранения чисел, вводимых пользователем
list_digits = []
# Переменная для промежуточного хранения вводимого символа
var_input = 0

print(f'Hello there!')
print(f'You can type some digits one by one with pressing Enter')
print(f'Note: we will check them all!')

# Цикл выполняется до обнаружения стоп-слова
while True:
# Запрос символа у пользователя
var_input = input(f'Type digit please. If you wanna stop, type "stop": ')

# Если пользователь ввёл стоп-слово
if var_input == 'stop':
# вывывести сообщение, что стоп-слово обнаружено, что будет выведен список введённых чисел
print(f'"stop" has been detected, lets look list of digits:')
# вывести список введённых чисел
print(list_digits)
# прервать цикл
break

# Пробовать
try:
# проверить, если символ является числом
if var_input.isdigit():
# добавить в список новый элемент - символ, преобразованный в число
list_digits.append(int(var_input))
# если символ оказался не числом
else:
# поднять исключение для ловли символов-нарушителей
raise MyStrangeException(f'"{var_input}" does not look like digit, be careful next time!')
# перехватить исключение
except MyStrangeException as new_exception:
# вывести очень важное сообщение
print(new_exception.strange_message)
48 changes: 48 additions & 0 deletions 8th hometask/4th task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Класс Склад
# store_id - номер склада, целочисленный атрибут
# store_capacity - вместимость склада, целочисленный атрибут
# store_description - краткое описание склада, опциональный строковый атрибут
class StorehouseOfficeDevice:
def __init__(self, store_id, store_capacity, store_description=None):
self.store_id = store_id
self.store_capacity = store_capacity
self.store_description = store_description


# Класс Оргтехника
# model - модель, стоковый атрибут
# cost - стоимость в долларах, числовой атрибут
# maker - производитель, опциональный строковый атрибут
class OfficeDevice:
def __init__(self, model, cost, maker=None):
self.model, self.cost, self.maker = model, cost, maker


# Класс Принтер
# Наследует все атрибуты класса Ортехника
# color - цвет печати, строковый атрибут
class Printer(OfficeDevice):
def __init__(self, model, cost, color, maker=None):
self.color = color
super(Printer, self).__init__(model, cost, maker)


# Класс Сканер
# Наследует все атрибуты класса Ортехника
# size - диагональ сканера в дюймах, числовой атрибут
class Scanner(OfficeDevice):
def __init__(self, model, cost, size, maker=None):
self.size = size
super(Scanner, self).__init__(model, cost, maker)


# Класс Ксерокс
# Наследует все атрибуты класса Ортехника
# paper_format - типы используемой бумаги, список строк
class Xerox(OfficeDevice):
def __init__(self, model, cost, *paper_format, maker=None):
self.paper_format = paper_format
super(Xerox, self).__init__(model, cost, maker)


pass
120 changes: 120 additions & 0 deletions 8th hometask/5th task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from abc import abstractmethod


# Класс Склад
# store_id - код склада, целочисленный атрибут
# store_capacity - вместимость склада, целочисленный атрибут
# store_description - краткое описание склада, опциональный строковый атрибут
# dict_stored_devices - словарь для хранения информации о размещении оргтехники в подразделении:
# код оргтехники: код подразделения
class StorehouseOfficeDevice:
def __init__(self, store_id, store_capacity, store_description=None):
self.store_id = store_id
self.store_capacity = store_capacity
self.store_description = store_description
self.dict_stored_devices = {}

# Метод Получить оргтехнику
# device_id - список кодов оргтехники
def get_device(self, *device_id):
for key in device_id:
self.dict_stored_devices[key] = self.store_id

# Метод Переместить оргтехнику
# device_id - словарь с информацией о перемещении:
# код оргтехники: код подразделения
def relocate_device(self, **device_id):
for key in device_id.keys():
self.dict_stored_devices[key] = device_id.get(key)
# Здесь наверно нужно вызвать метод оргтехники Переместить оргтехнику,
# но не понимаю как можно реализовать обращение к ещё не объявленному объекту класса Оргтехника
# Printer.relocate_device(device_id.get(key))
# Scanner.relocate_device(device_id.get(key))
# Xerox.relocate_device(device_id.get(key))


# Класс Оргтехника
# device_id - код оргтехники
# model - модель, стоковый атрибут
# cost - стоимость в долларах, числовой атрибут
# maker - производитель, опциональный строковый атрибут
class OfficeDevice:
def __init__(self, device_id, location, model, cost, maker=None):
self.device_id, self.location, self.model, self.cost, self.maker = device_id, location, model, cost, maker

# Метод Амортизация оргтехники
@abstractmethod
def discount(self):
self.cost = self.cost * 0.9

# Метод Переместить оргтехнику
@abstractmethod
def relocate_device(self, location):
self.location = location


# Класс Принтер
# Наследует все атрибуты класса Ортехника
# color - цвет печати, строковый атрибут
class Printer(OfficeDevice):
def __init__(self, device_id, location, model, cost, color, maker=None):
self.color = color
super(Printer, self).__init__(device_id, location, model, cost, maker)

# Метод Амортизация оргтехники
def discount(self):
self.cost = self.cost * 0.9

# Метод Переместить оргтехнику
def relocate_device(self, location):
self.location = location


# Класс Сканер
# Наследует все атрибуты класса Ортехника
# size - диагональ сканера в дюймах, числовой атрибут
class Scanner(OfficeDevice):
def __init__(self, device_id, location, model, cost, size, maker=None):
self.size = size
super(Scanner, self).__init__(device_id, location, model, cost, maker)

# Метод Амортизация оргтехники
def discount(self):
self.cost = self.cost * 0.9

# Метод Переместить оргтехнику
def relocate_device(self, location):
self.location = location


# Класс Ксерокс
# Наследует все атрибуты класса Ортехника
# paper_format - типы используемой бумаги, список строк
class Xerox(OfficeDevice):
def __init__(self, device_id, location, model, cost, *paper_format, maker=None):
self.paper_format = paper_format
super(Xerox, self).__init__(device_id, location, model, cost, maker)

# Метод Амортизация оргтехники
def discount(self):
self.cost = self.cost * 0.9

# Метод Переместить оргтехнику
def relocate_device(self, location):
self.location = location


# Класс Подразделение
# division_id - код подразделения, целочисленный атрибут
# division_description - краткое описание подразделения, опциональный строковый атрибут
class Division:
def __init__(self, division_id, division_description=None):
self.division_id, self.division_description = division_id, division_description
self.list_devices_in_use = []

# Метод Получить оргтехнику
def get_device(self, device_id):
self.list_devices_in_use.append(device_id)


pass
Loading