diff --git a/05_hw_01.py b/05_hw_01.py new file mode 100644 index 0000000..a5e3c49 --- /dev/null +++ b/05_hw_01.py @@ -0,0 +1,13 @@ +# 1) Создать программно файл в текстовом формате, записать в него построчно данные, +# вводимые пользователем. Об окончании ввода данных свидетельствует пустая строка. + + +my_f = input('Введите имя файла: ') +with open(f"{my_f}.txt", "w") as write_f: + while True: + my_input = input('Введите информацию построчной для записи в файл \n' + '(для окончания записи - оставьте строку пустой, нажмите Enter): ') + if len(my_input) > 0: + write_f.writelines(f'{my_input}\n') + else: + break diff --git a/05_hw_02.py b/05_hw_02.py new file mode 100644 index 0000000..1227548 --- /dev/null +++ b/05_hw_02.py @@ -0,0 +1,24 @@ +# 2) Создать текстовый файл (не программно), сохранить в нем несколько строк, выполнить +# подсчет количества строк, количества слов в каждой строке. + +with open("05_hw_02_text.txt") as my_f: + i = 0 + for line in my_f: + i += 1 + if len(line.split()) == 0: + print(f'Строка № {i} пуста') + elif len(line.split()) == 1: + print(f'Строка № {i} содержит {len(line.split())} слово') + elif len(line.split()) in range(2, 5): + print(f'Строка № {i} содержит {len(line.split())} слова') + else: + print(f'Строка № {i} содержит {len(line.split())} слов') + +if i == 0: + print('Текстовый файл пуст') +elif i == 1: + print(f'Текстовый файл содержит {i} строку') +elif i in range(2, 5): + print(f'Текстовый файл содержит {i} строки') +else: + print(f'Текстовый файл содержит {i} строк') diff --git a/05_hw_02_text.txt b/05_hw_02_text.txt new file mode 100644 index 0000000..cb7e434 --- /dev/null +++ b/05_hw_02_text.txt @@ -0,0 +1,4 @@ +I like Python +Python has a simple syntaxis +Learn Python +Python gives you bright future diff --git a/05_hw_03.py b/05_hw_03.py new file mode 100644 index 0000000..47a6141 --- /dev/null +++ b/05_hw_03.py @@ -0,0 +1,17 @@ +# 3) Создать текстовый файл (не программно), построчно записать фамилии сотрудников и +# величину их окладов. Определить, кто из сотрудников имеет оклад менее 20 тыс., +# вывести фамилии этих сотрудников. Выполнить подсчет средней величины дохода сотрудников. + +with open("05_hw_03_text.txt") as my_f: + sname_list = [] + sal_list = [] + for line in my_f: + sname_list.append((line).split()[0]) + sal_list.append(float((line).split()[1])) +less_sal_list = [] +for el in sal_list: + if el < 20000: + less_sal_list.append(sname_list[sal_list.index(el)]) +print('Сотрудники с зарплатой менее 20000:', ', '.join(less_sal_list)) +print('Средняя зарплата сотрудников: %.2f' % ((sum(sal_list)) / (len(sal_list)))) + diff --git a/05_hw_03_text.txt b/05_hw_03_text.txt new file mode 100644 index 0000000..daa83b1 --- /dev/null +++ b/05_hw_03_text.txt @@ -0,0 +1,5 @@ +Ivanov 35000 +Petrov 55000 +Rzhevscky 18000 +Sidorov 17500 +Brin 98000 \ No newline at end of file diff --git a/05_hw_04.py b/05_hw_04.py new file mode 100644 index 0000000..970ad04 --- /dev/null +++ b/05_hw_04.py @@ -0,0 +1,32 @@ +# 4) Создать (не программно) текстовый файл со следующим содержимым: +# One — 1 +# Two — 2 +# Three — 3 +# Four — 4 +# Необходимо написать программу, открывающую файл на чтение и считывающую построчно +# данные. При этом английские числительные должны заменяться на русские. Новый блок строк +# должен записываться в новый текстовый файл. + +my_dict = {'One': 'Один', 'Two': 'Два', 'Three': 'Три', 'Four': 'Четыре'} + +with open("05_hw_04_text.txt") as my_f: + my_list = [] + for line in my_f: + my_list.append(line.split()) +print(my_list) + +i = 0 +for elm in my_list: + for elm in my_list[i]: + if elm in my_dict: + my_list[i][0] = my_dict.get(elm) + else: + continue + i += 1 +print(my_list) + +with open("05_hw_04_tran.txt", "w") as write_f: + i = 0 + while i < len(my_list): + print(' '.join(my_list[i]), file=write_f) + i += 1 diff --git a/05_hw_04_text.txt b/05_hw_04_text.txt new file mode 100644 index 0000000..055b192 --- /dev/null +++ b/05_hw_04_text.txt @@ -0,0 +1,4 @@ +One 1 +Two 2 +Three 3 +Four 4 diff --git a/05_hw_04_tran.txt b/05_hw_04_tran.txt new file mode 100644 index 0000000..3925427 --- /dev/null +++ b/05_hw_04_tran.txt @@ -0,0 +1,4 @@ + 1 + 2 + 3 + 4 diff --git a/05_hw_05.py b/05_hw_05.py new file mode 100644 index 0000000..129acc1 --- /dev/null +++ b/05_hw_05.py @@ -0,0 +1,18 @@ +# 5) Создать (программно) текстовый файл, записать в него программно набор чисел, +# разделенных пробелами. Программа должна подсчитывать сумму чисел в файле и выводить +# ее на экран. + +my_f = input('Введите имя файла: ') +a = input('Введите нескольких чисел, разделённых пробелами: ').split() + +with open(f'{my_f}.txt', 'w') as data_f: + data_f.write(' '.join(a)) + +with open(f'{my_f}.txt', 'r') as data_f: + content = data_f.read().split() + +sum_f = 0 +for el in content: + sum_f += float(el) + +print('Сумма чисел в файле:', sum_f) diff --git a/05_hw_06.py b/05_hw_06.py new file mode 100644 index 0000000..f107b6c --- /dev/null +++ b/05_hw_06.py @@ -0,0 +1,24 @@ +# 6) Необходимо создать (не программно) текстовый файл, где каждая строка описывает учебный +# предмет и наличие лекционных, практических и лабораторных занятий по этому предмету и их +# количество. Важно, чтобы для каждого предмета не обязательно были все типы занятий. +# Сформировать словарь, содержащий название предмета и общее количество занятий по +# нему. Вывести словарь на экран. + +my_dict = {} +my_list = [] + +with open('05_hw_06_text.txt', 'r') as my_f: + for el in my_f: + my_list.append(el.split()) + +i = 1 +while i < len(my_list): + j = 1 + sum_s = 0 + while j < len(my_list[i]): + sum_s += int(my_list[i][j]) + j += 1 + my_dict.update({my_list[i][0]:sum_s}) + i += 1 + +print('Сумма часов по предметам:', my_dict) diff --git a/05_hw_06_text.txt b/05_hw_06_text.txt new file mode 100644 index 0000000..aa4df95 --- /dev/null +++ b/05_hw_06_text.txt @@ -0,0 +1,4 @@ +Subject Lecture Practice Lab +Math 50 80 0 +Coding 40 40 60 +Fitness 0 60 0 \ No newline at end of file diff --git a/05_hw_07.py b/05_hw_07.py new file mode 100644 index 0000000..6125af6 --- /dev/null +++ b/05_hw_07.py @@ -0,0 +1,27 @@ +# 7) Создать (не программно) текстовый файл, в котором каждая строка должна содержать данные +# о фирме: название, форма собственности, выручка, издержки. Необходимо вычислить +# прибыль каждой компании и среднюю прибыль. Реализовать список, содержащий словарь +# (название фирмы и прибыль) и словарь с одним элементом (средняя прибыль). Добавить в +# первый словарь еще один элемент, содержащий результат вычисления отношения прибыли к +# убыткам. Итоговый список сохранить в файл. +# Подсказка: использовать менеджеры контекста. + +my_dict1 = {} +my_list = [] + +with open('05_hw_07_text.txt', 'r') as my_f: + for el in my_f: + my_list.append(el.split()) + +i = 1 +while i < len(my_list): + j = 2 + pribyl = 0 + pribyl = float(my_list[i][2]) - float(my_list[i][3]) + my_dict1.update({my_list[i][0]:pribyl}) + i += 1 + +my_dict2 = {'Sredn_prib': sum(my_dict1.values())/3} +my_list2 = [my_dict1, my_dict2] + +print(my_list2) diff --git a/05_hw_07_text.txt b/05_hw_07_text.txt new file mode 100644 index 0000000..392566b --- /dev/null +++ b/05_hw_07_text.txt @@ -0,0 +1,4 @@ +Name Form Vyruchka Izderzhki +Sharkon OOO 1000 900 +Zolotarev IP 3000 1300 +Incorpo PAO 10000 6000 \ No newline at end of file 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() 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) 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))