diff --git a/4/4_1.py b/4/4_1.py new file mode 100644 index 0000000..bd2eb41 --- /dev/null +++ b/4/4_1.py @@ -0,0 +1,14 @@ +# 1. Реализовать скрипт, в котором должна быть предусмотрена функция расчета заработной платы сотрудника. В расчете +# необходимо использовать формулу: (выработка в часах * ставка в час) + премия. Для выполнения расчета для конкретных +# значений необходимо запускать скрипт с параметрами. + +from sys import argv + + +def salary_culc_func(hours_of_work, salary_per_hour, prize): + return (hours_of_work * salary_per_hour) + prize + + +file_path, hours_of_work, salary_per_hour, prize = argv +print(argv) +print(salary_culc_func(int(hours_of_work), int(salary_per_hour), int(prize))) diff --git a/4/4_2.py b/4/4_2.py new file mode 100644 index 0000000..1982329 --- /dev/null +++ b/4/4_2.py @@ -0,0 +1,11 @@ +# 2. Представлен список чисел. Необходимо вывести элементы исходного списка, значения которых больше предыдущего +# элемента. Подсказка: элементы, удовлетворяющие условию, оформить в виде списка. Для формирования списка использовать +# генератор. Пример исходного списка: [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]. +# Результат: [12, 44, 4, 10, 78, 123]. + +spisok = [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55] + +new_spisok = [spisok[el] for el in range(1, len(spisok) - 1) if spisok[el - 1] < spisok[el]] + +print(new_spisok) + diff --git a/4/4_3.py b/4/4_3.py new file mode 100644 index 0000000..4486de0 --- /dev/null +++ b/4/4_3.py @@ -0,0 +1,6 @@ +# 3. Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21. Необходимо решить задание в одну строку. +# Подсказка: использовать функцию range() и генератор. + +numbers_list = [el for el in range(20, 241) if (el % 20 == 0 or el % 21 == 0)] + +print(numbers_list) diff --git a/4/4_4.py b/4/4_4.py new file mode 100644 index 0000000..32e2320 --- /dev/null +++ b/4/4_4.py @@ -0,0 +1,20 @@ +# 4. Представлен список чисел. Определить элементы списка, не имеющие повторений. Сформировать итоговый массив чисел, +# соответствующих требованию. Элементы вывести в порядке их следования в исходном списке. Для выполнения задания +# обязательно использовать генератор. +# Пример исходного списка: [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11]. +# Результат: [23, 1, 3, 10, 4, 11] + +original_list = [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11] +new_list = [] + +def generator(): + for el in original_list: + if original_list.count(el) == 1: + new_list.append(el) + yield new_list + + +for i in generator(): + print(i) + + diff --git a/4/4_5.py b/4/4_5.py new file mode 100644 index 0000000..117ca7d --- /dev/null +++ b/4/4_5.py @@ -0,0 +1,16 @@ +# 5. Реализовать формирование списка, используя функцию range() и возможности генератора. В список должны войти четные +# числа от 100 до 1000 (включая границы). Необходимо получить результат вычисления произведения всех элементов списка. +# Подсказка: использовать функцию reduce(). + +from functools import reduce + +numbers_list = [el for el in range(100, 1001) if el % 2 == 0] + + +def my_func(prev_el, el): + # prev_el - предыдущий элемент + # el - текущий элемент + return prev_el * el + + +print(reduce(my_func, numbers_list)) diff --git a/4/4_6.py b/4/4_6.py new file mode 100644 index 0000000..58b40d6 --- /dev/null +++ b/4/4_6.py @@ -0,0 +1,26 @@ +# 6. Реализовать два небольших скрипта: +# а) итератор, генерирующий целые числа, начиная с указанного, +# б) итератор, повторяющий элементы некоторого списка, определенного заранее. +# Подсказка: использовать функцию count() и cycle() модуля itertools. Обратите внимание, что создаваемый цикл +# не должен быть бесконечным. Необходимо предусмотреть условие его завершения. +# Например, в первом задании выводим целые числа, начиная с 3, а при достижении числа 10 завершаем цикл. Во втором +# также необходимо предусмотреть условие, при котором повторение элементов списка будет прекращено. + +from itertools import count +from itertools import cycle + +a = 3 +for el in count(a): + if el > 10: + break + else: + print(el) + + +spisok = ['1fghj', '2lkjhgfds', '3dzjtez'] +b = 0 +for el in cycle(spisok): + if b > 5: + break + print(el) + b += 1 diff --git a/4/4_7.py b/4/4_7.py new file mode 100644 index 0000000..7e6da87 --- /dev/null +++ b/4/4_7.py @@ -0,0 +1,13 @@ +# 7. Реализовать генератор с помощью функции с ключевым словом yield, создающим очередное значение. При вызове функции +# должен создаваться объект-генератор. Функция должна вызываться следующим образом: for el in fact(n). Функция отвечает +# за получение факториала числа, а в цикле необходимо выводить только первые n чисел, начиная с 1! и до n!. +# Подсказка: факториал числа n — произведение чисел от 1 до n. Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24. +def fact(n): + factorial = 1 + for i in range(1, n + 1): + factorial = factorial * i + yield factorial + + +for el in fact(4): + print(el) diff --git a/5/5_1.py b/5/5_1.py new file mode 100644 index 0000000..5fc3d92 --- /dev/null +++ b/5/5_1.py @@ -0,0 +1,11 @@ +# 1. Создать программно файл в текстовом формате, записать в него построчно данные, вводимые пользователем. +# Об окончании ввода данных свидетельствует пустая строка. + +with open("testfile1.txt", "w", encoding="utf-8") as file_object: + new_line = str() + while True: + new_line = input('Введите данные для ввода в файл по одной строке: \n') + if len(new_line) == 0: + break + else: + file_object.writelines(f'{new_line}\n') diff --git a/5/5_2.py b/5/5_2.py new file mode 100644 index 0000000..1590125 --- /dev/null +++ b/5/5_2.py @@ -0,0 +1,13 @@ +# 2. Создать текстовый файл (не программно), сохранить в нем несколько строк, выполнить подсчет количества строк, +# количества слов в каждой строке. + +cnt = 0 + +with open("testfile2.txt", "r", encoding="utf-8") as file_object: + for line in file_object: + line_length = len(line) + cnt += 1 + print(f'Длина {cnt} строки {line_length}') + +print(f'В файле {cnt} строк') + diff --git a/5/5_3.py b/5/5_3.py new file mode 100644 index 0000000..61f1bd3 --- /dev/null +++ b/5/5_3.py @@ -0,0 +1,21 @@ +# 3. Создать текстовый файл (не программно), построчно записать фамилии сотрудников и величину их окладов. +# Определить, кто из сотрудников имеет оклад менее 20 тыс., вывести фамилии этих сотрудников. Выполнить подсчет +# средней величины дохода сотрудников. + +sum_of_salaries = 0 +cnt_of_workers = 0 +workers_with_low_salary = [] + +with open("testfile3.txt", "r", encoding="utf-8") as file_object: + for line in file_object: + new_line = line.split(', ') + cnt_of_workers += 1 + sum_of_salaries += float(new_line[1]) + if float(new_line[1]) <= 20000: + workers_with_low_salary.append(new_line[0]) + +print(f'Общее число сотрудников: {cnt_of_workers}') +print(f'Средняя зарплата: {round(sum_of_salaries/cnt_of_workers)}') +print('Cотрудники c окладом менее 20 тыс рублей: ') +for i in workers_with_low_salary: + print(i) diff --git a/5/5_4.py b/5/5_4.py new file mode 100644 index 0000000..9341dd7 --- /dev/null +++ b/5/5_4.py @@ -0,0 +1,21 @@ +# 4. Создать (не программно) текстовый файл со следующим содержимым: +# One — 1 +# Two — 2 +# Three — 3 +# Four — 4 +# Необходимо написать программу, открывающую файл на чтение и считывающую построчно данные. При этом английские +# числительные должны заменяться на русские. Новый блок строк должен записываться в новый текстовый файл. + +new_dict = {'One': 'Один', 'Two': 'Два', 'Three': 'Три', 'Four': 'Четыре'} +full_data_to_write = [] + +with open("testfile4.txt", "r", encoding="utf-8") as file_object: + for line in file_object: + new_line = line.split(' — ') + data_to_write = new_dict.get(new_line[0]) + ' - ' + new_line[1] + full_data_to_write.append(data_to_write) + + +file_object_1 = open("testfile4_2.txt", "w", encoding="utf-8") +file_object_1.writelines(full_data_to_write) +file_object_1.close() diff --git a/5/5_5.py b/5/5_5.py new file mode 100644 index 0000000..e116c03 --- /dev/null +++ b/5/5_5.py @@ -0,0 +1,25 @@ +# 5. Создать (программно) текстовый файл, записать в него программно набор чисел, разделенных пробелами. Программа +# должна подсчитывать сумму чисел в файле и выводить ее на экран. + +def get_numbers(): + while True: + try: + input_data = input('Введите набор чисел через пробел: ') + for element in input_data.split(' '): + element = float(element) + return input_data + except Exception as err: + print("Ошибка ввода") + + +with open("testfile5.txt", "w", encoding="utf-8") as file_object: + file_object.writelines(get_numbers()) + +sum_of_numbers = 0 + +with open("testfile5.txt", "r", encoding="utf-8") as file_object1: + output_data = file_object1.readline() + for element in output_data.split(' '): + sum_of_numbers += float(element) + print(element) + print(f'Сумма чисел в файле: {sum_of_numbers}') diff --git a/5/5_6.py b/5/5_6.py new file mode 100644 index 0000000..c64d9e3 --- /dev/null +++ b/5/5_6.py @@ -0,0 +1,32 @@ +# 6. Необходимо создать (не программно) текстовый файл, где каждая строка описывает учебный предмет и наличие +# лекционных, практических и лабораторных занятий по этому предмету и их количество. Важно, чтобы для каждого предмета +# не обязательно были все типы занятий. Сформировать словарь, содержащий название предмета и общее количество занятий +# по нему. Вывести словарь на экран. +# Примеры строк файла: +# Информатика: 100(л) 50(пр) 20(лаб). +# Физика: 30(л) — 10(лаб) +# Физкультура: — 30(пр) — +# +# Пример словаря: +# {“Информатика”: 170, “Физика”: 40, “Физкультура”: 30} + +school_subjects = {} + +with open("testfile6.txt", "r", encoding="utf-8") as file_object: + new_file = file_object.readlines() + for line in new_file: + sum_of_hours = 0 + cnt = 0 + for element in line.split(' '): + cnt += 1 + if cnt == 1: + subject_name = element[0:len(element)-1] + else: + try: + hours = element.split('(') + sum_of_hours += int(hours[0]) + except Exception as err: + pass + school_subjects.setdefault(subject_name, sum_of_hours) + +print(school_subjects) diff --git a/5/5_7.py b/5/5_7.py new file mode 100644 index 0000000..7d0d39f --- /dev/null +++ b/5/5_7.py @@ -0,0 +1,41 @@ +# 7. Создать (не программно) текстовый файл, в котором каждая строка должна содержать данные о фирме: название, +# форма собственности, выручка, издержки. +# Пример строки файла: firm_1 ООО 10000 5000. +# Необходимо построчно прочитать файл, вычислить прибыль каждой компании, а также среднюю прибыль. Если фирма получила +# убытки, в расчет средней прибыли ее не включать. +# Далее реализовать список. Он должен содержать словарь с фирмами и их прибылями, а также словарь со средней прибылью. +# Если фирма получила убытки, также добавить ее в словарь (со значением убытков). +# Пример списка: [{“firm_1”: 5000, “firm_2”: 3000, “firm_3”: 1000}, {“average_profit”: 2000}]. +# Итоговый список сохранить в виде json-объекта в соответствующий файл. +# Пример json-объекта: +# [{"firm_1": 5000, "firm_2": 3000, "firm_3": 1000}, {"average_profit": 2000}] +# +# Подсказка: использовать менеджеры контекста. +import json + +firms = { } +average_profit_dict = { } +sum_of_profits = 0 +cnt1 = 0 +with open("testfile7.txt", "r", encoding="utf-8") as file_object: + new_file = file_object.readlines() + for line in new_file: + cnt = 0 + for element in line.split(' '): + cnt += 1 + if cnt == 1: + firm_name = element + elif cnt == 3: + proceeds = int(element) + elif cnt == 4: + costs = int(element) + profit = proceeds - costs + firms.setdefault(firm_name, profit) + if costs <= proceeds: + sum_of_profits += profit + cnt1 += 1 + average_profit_dict.setdefault('average_profit', sum_of_profits / cnt1) + +final_list = [firms, average_profit_dict] +with open("testfile7_1.json", "w") as write_f: + json.dump(final_list, write_f) diff --git a/5/testfile1.txt b/5/testfile1.txt new file mode 100644 index 0000000..2ea8737 --- /dev/null +++ b/5/testfile1.txt @@ -0,0 +1 @@ +sdfghjkl; diff --git a/5/testfile2.txt b/5/testfile2.txt new file mode 100644 index 0000000..161dd37 --- /dev/null +++ b/5/testfile2.txt @@ -0,0 +1,6 @@ +Создать текстовый +файл (не программно), +сохранить в нем несколько строк, +выполнить подсчет +количества строк, +количества слов в каждой строке. \ No newline at end of file diff --git a/5/testfile3.txt b/5/testfile3.txt new file mode 100644 index 0000000..da2c2cc --- /dev/null +++ b/5/testfile3.txt @@ -0,0 +1,10 @@ +Dunlop, 24578.90 +Sargood, 27096.45 +Hogan, 17494.50 +Fillimore, 19574.00 +Ivoshin, 18810.65 +McGeoch, 21273.45 +Abramovic, 17890789.45 +Kording, 26742.90 +Chasmor, 26744.66 +Hugh, 17988.34 \ No newline at end of file diff --git a/5/testfile4.txt b/5/testfile4.txt new file mode 100644 index 0000000..a13d26b --- /dev/null +++ b/5/testfile4.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Three — 3 +Four — 4 diff --git a/5/testfile4_2.txt b/5/testfile4_2.txt new file mode 100644 index 0000000..ab95344 --- /dev/null +++ b/5/testfile4_2.txt @@ -0,0 +1,4 @@ +Один - 1 +Два - 2 +Три - 3 +Четыре - 4 diff --git a/5/testfile5.txt b/5/testfile5.txt new file mode 100644 index 0000000..e69de29 diff --git a/5/testfile6.txt b/5/testfile6.txt new file mode 100644 index 0000000..a349890 --- /dev/null +++ b/5/testfile6.txt @@ -0,0 +1,3 @@ +Информатика: 100(л) 50(пр) 20(лаб) +Физика: 30(л) — 10(лаб) +Физкультура: — 30(пр) — \ No newline at end of file diff --git a/5/testfile7.txt b/5/testfile7.txt new file mode 100644 index 0000000..2f1f905 --- /dev/null +++ b/5/testfile7.txt @@ -0,0 +1,3 @@ +firm_1 ООО 10000 5000 +firm_2 ООО 20000 3000 +firm_3 ООО 9000 10000 \ No newline at end of file diff --git a/5/testfile7_1.json b/5/testfile7_1.json new file mode 100644 index 0000000..d08a198 --- /dev/null +++ b/5/testfile7_1.json @@ -0,0 +1 @@ +[{"firm_1": 5000, "firm_2": 17000, "firm_3": -1000}, {"average_profit": 11000.0}] \ No newline at end of file diff --git a/6/6_1.py b/6/6_1.py new file mode 100644 index 0000000..92b65a8 --- /dev/null +++ b/6/6_1.py @@ -0,0 +1,42 @@ +# 1. Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) и метод running (запуск). +# Атрибут реализовать как приватный. В рамках метода реализовать переключение светофора в режимы: красный, желтый, +# зеленый. Продолжительность первого состояния (красный) составляет 7 секунд, второго (желтый) — 2 секунды, третьего +# (зеленый) — на ваше усмотрение. Переключение между режимами должно осуществляться только в указанном порядке +# (красный, желтый, зеленый). Проверить работу примера, создав экземпляр и вызвав описанный метод. +# Задачу можно усложнить, реализовав проверку порядка режимов, и при его нарушении выводить соответствующее +# сообщение и завершать скрипт. + +from time import sleep + + +class TrafficLight: + __color = [('красный', 7), ('желтый', 2), ('зеленый', 6)] + + def checkout_data(self): + """ проверка данных и порядка смены цветов""" + colors = ['красный', 'желтый', 'зеленый'] + for element in self.__color: + if element[0] not in colors: + print('Некорректные цвета') + elif self.__color[0][0] != colors[0] or self.__color[1][0] != colors[1] or self.__color[2][0] != colors[2]: + print('Задан неправильный порядок смены цветов') + elif self.__color[0][1] != 7 or self.__color[1][1] != 2: + print('Некорректное время ожидания') + + def changing_colors(self): + for color in self.__color: + print(color[0]) + sleep(color[1]) + + def running(self): + n = 3 + self.checkout_data() + i = 0 + while i < n: + self.changing_colors() + i += 1 + + +if __name__ == '__main__': + t = TrafficLight() + t.running() diff --git a/6/6_2.py b/6/6_2.py new file mode 100644 index 0000000..65a121b --- /dev/null +++ b/6/6_2.py @@ -0,0 +1,25 @@ +# 2. Реализовать класс Road (дорога), в котором определить атрибуты: length (длина), width (ширина). Значения данных +# атрибутов должны передаваться при создании экземпляра класса. Атрибуты сделать защищенными. Определить метод расчета +# массы асфальта, необходимого для покрытия всего дорожного полотна. Использовать формулу: +# длина * ширина * масса асфальта для покрытия одного кв метра дороги асфальтом, толщиной в 1 см * число см +# толщины полотна. Проверить работу метода. +# Например: 20м * 5000м * 25кг * 5см = 12500 т + +class Road: + _mass_for_one_m2 = 25 + _thickness = 5 + + def __init__(self, length, width): + self._length = length + self._width = width + + def mass_calculation(self): + """Расчет массы асфальта, необходимого для покрытия всего дорожного полотна. Формула: + длина * ширина * (масса асфальта для покрытия 1 м2 дороги асфальтом, толщиной в 1 см) * толщина в см""" + full_mass = self._length * self._width * self._mass_for_one_m2 * self._thickness + return f'Масса асфальта в тоннах: {full_mass/1000}' + + +if __name__ == '__main__': + r = Road(length=5000, width=20) + print(r.mass_calculation()) diff --git a/6/6_3.py b/6/6_3.py new file mode 100644 index 0000000..b441633 --- /dev/null +++ b/6/6_3.py @@ -0,0 +1,35 @@ +# 3. Реализовать базовый класс Worker (работник), в котором определить атрибуты: name, surname, position (должность), +# income (доход). Последний атрибут должен быть защищенным и ссылаться на словарь, содержащий элементы: оклад и премия, +# например, {"wage": wage, "bonus": bonus}. Создать класс Position (должность) на базе класса Worker. В классе Position +# реализовать методы получения полного имени сотрудника (get_full_name) и дохода с учетом премии (get_total_income). +# Проверить работу примера на реальных данных (создать экземпляры класса Position, передать данные, проверить значения +# атрибутов, вызвать методы экземпляров). + +class Worker: + def __init__(self, name, surname, position, income): + self.name = name + self.surname = surname + self.position = position + self._income = income + + +class Position(Worker): + + def __init__(self, name, surname, position, income): + super().__init__(name, surname, position, income) + self._full_income_value = self._income.get('wage') + self._income.get('bonus') + + def get_full_name(self): + """Метод получения полного имени сотрудника""" + return f'Полное имя: {self.name} {self.surname}' + + def get_total_income(self): + """Метод получения дохода с учетом премии""" + return f'Доход с учетом премии: {self._full_income_value} руб.' + + +if __name__ == '__main__': + income_ivanov = {'wage': 100000, 'bonus': 20000} + p = Position(name='Иван', surname='Иванов', position='пилот', income=income_ivanov) + print(p.get_full_name()) + print(p.get_total_income()) diff --git a/6/6_4.py b/6/6_4.py new file mode 100644 index 0000000..949acb2 --- /dev/null +++ b/6/6_4.py @@ -0,0 +1,79 @@ +# 4. Реализуйте базовый класс Car. У данного класса должны быть следующие атрибуты: speed, color, name, is_police +# (булево). А также методы: go, stop, turn(direction), которые должны сообщать, что машина поехала, остановилась, +# повернула (куда). Опишите несколько дочерних классов: TownCar, SportCar, WorkCar, PoliceCar. Добавьте в базовый +# класс метод show_speed, который должен показывать текущую скорость автомобиля. Для классов TownCar и WorkCar +# переопределите метод show_speed. При значении скорости свыше 60 (TownCar) и 40 (WorkCar) должно выводиться +# сообщение о превышении скорости. +# Создайте экземпляры классов, передайте значения атрибутов. Выполните доступ к атрибутам, выведите результат. +# Выполните вызов методов и также покажите результат. + +class Car: + def __init__(self, name, speed, color, is_police): + self.name = name + self.speed = speed + self.color = color + self.is_police = is_police + + def show_speed(self): + print(f'Текущая скорость автомобиля: {self.speed}') + + def go(self): + print('машина поехала') + + def stop(self): + print('машина остановилась') + + def turn_direction(self): + print('машина повернула') + + +class TownCar(Car): + def __init__(self, name, speed, color, is_police): + super().__init__(name, speed, color, is_police) + + def show_speed(self): + if self.speed <= 60: + print(f'Текущая скорость автомобиля: {self.speed}') + else: + print(f'Превышение установленной скорости движения транспортного средства, равной 60 км/ч!!!' \ + f'Текущая скорость автомобиля: {self.speed}') + + +class SportCar(Car): + def __init__(self, name, speed, color, is_police): + super().__init__(name, speed, color, is_police) + + +class WorkCar(Car): + def __init__(self, name, speed, color, is_police): + super().__init__(name, speed, color, is_police) + + def show_speed(self): + if self.speed <= 40: + print(f'Текущая скорость автомобиля: {self.speed}') + else: + print(f'Превышение установленной скорости движения транспортного средства, равной 40 км/ч!!!' \ + f'Текущая скорость автомобиля: {self.speed}') + + +class PoliceCar(Car): + def __init__(self, name, speed, color, is_police): + super().__init__(name, speed, color, is_police) + + +if __name__ == '__main__': + t = TownCar(speed=48, color='green', name='УАЗ-3303', is_police=False) + s = SportCar(speed=180, color='red', name='Ferrari 488', is_police=False) + w = WorkCar(speed=50, color='black', name='ВАЗ-2109', is_police=False) + p = PoliceCar(speed=80, color='white', name='UAZ Patriot', is_police=True) + + print(t.__dict__) + print(s.__dict__) + print(w.__dict__) + print(p.__dict__) + + t.show_speed() + s.go() + w.show_speed() + p.turn_direction() + p.stop() diff --git a/6/6_5.py b/6/6_5.py new file mode 100644 index 0000000..faf295a --- /dev/null +++ b/6/6_5.py @@ -0,0 +1,46 @@ +# 5. Реализовать класс Stationery (канцелярская принадлежность). Определить в нем атрибут title (название) и +# метод draw (отрисовка). Метод выводит сообщение “Запуск отрисовки.” Создать три дочерних класса Pen (ручка), +# Pencil (карандаш), Handle (маркер). В каждом из классов реализовать переопределение метода draw. Для каждого из +# классов методы должен выводить уникальное сообщение. Создать экземпляры классов и проверить, что выведет описанный +# метод для каждого экземпляра. + +class Stationery: + def __init__(self, title): + self.title = title + + def draw(self): + print('Запуск отрисовки.') + + +class Pen(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + print('Запуск отрисовки ручкой.') + + +class Pensil(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + print('Запуск отрисовки карандашом.') + + +class Handle(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + print('Запуск отрисовки маркером.') + + +if __name__ == '__main__': + pen = Pen('black') + pensil = Pensil('blue') + handle = Handle('red') + + pen.draw() + pensil.draw() + handle.draw()