diff --git a/HW_2/hw_2_1.py b/HW_2/hw_2_1.py new file mode 100644 index 0000000..e7149e5 --- /dev/null +++ b/HW_2/hw_2_1.py @@ -0,0 +1,15 @@ +# 1. Создать список и заполнить его элементами различных типов данных. +# Реализовать скрипт проверки типа данных каждого элемента. Использовать функцию type() для проверки типа. +# Элементы списка можно не запрашивать у пользователя, а указать явно, в программе. + + +my_int = 5 +my_float = 1.98 +my_str = "Hello World" +my_list = ["Michael Jordan", 23] +my_tuple = ("Magic Johnson", 32) +my_dict = {"NBA": "Team Chicago Bulls", "city": "Chicago"} + +full_list = [my_int, my_float, my_str, my_list, my_tuple, my_dict] +for i in full_list: + print(f"{i} is {type(i)}") diff --git a/HW_2/hw_2_2.py b/HW_2/hw_2_2.py new file mode 100644 index 0000000..e87a311 --- /dev/null +++ b/HW_2/hw_2_2.py @@ -0,0 +1,18 @@ +# 2. Для списка реализовать обмен значений соседних элементов, т.е. +# Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д. +# При нечетном количестве элементов последний сохранить на своем месте. +# Для заполнения списка элементов необходимо использовать функцию input(). + + +el_count = int(input("Введите количество элементов списка ")) +my_list = [] +i = 0 +el = 0 +while i < el_count: + my_list.append(input("Введите следующее значение списка ")) + i += 1 + +for elem in range(int(len(my_list) / 2)): + my_list[el], my_list[el + 1] = my_list[el + 1], my_list[el] + el += 2 +print(my_list) diff --git a/HW_2/hw_2_3.py b/HW_2/hw_2_3.py new file mode 100644 index 0000000..08d8c0f --- /dev/null +++ b/HW_2/hw_2_3.py @@ -0,0 +1,50 @@ +# 3. Пользователь вводит месяц в виде целого числа от 1 до 12. +# Сообщить к какому времени года относится месяц (зима, весна, лето, осень). +# Напишите решения через list и через dict. + + +seasons_list = ['January', 'February', 'March', 'April', 'May', 'June', + 'Jule', 'August', 'September', 'October', 'November', 'December'] + +seasons_dict = {1: 'winter', 2: 'spring', 3: 'summer', 4: "autumn"} + +month = int(input('Enter month from 1 to 12: ')) + +if month == 1: + print(seasons_dict.get(1)) + print(seasons_list[0]) +elif month == 2: + print(seasons_dict.get(1)) + print(seasons_list[1]) +elif month == 12: + print(seasons_dict.get(1)) + print(seasons_list[11]) +elif month == 3: + print(seasons_dict.get(2)) + print(seasons_list[2]) +elif month == 4: + print(seasons_dict.get(2)) + print(seasons_list[3]) +elif month == 5: + print(seasons_dict.get(2)) + print(seasons_list[4]) +elif month == 6: + print(seasons_dict.get(3)) + print(seasons_list[5]) +elif month == 7: + print(seasons_dict.get(3)) + print(seasons_list[6]) +elif month == 8: + print(seasons_dict.get(3)) + print(seasons_list[7]) +elif month == 9: + print(seasons_dict.get(4)) + print(seasons_list[8]) +elif month == 10: + print(seasons_dict.get(4)) + print(seasons_list[9]) +elif month == 11: + print(seasons_dict.get(4)) + print(seasons_list[10]) +else: + print("No such month exists.") \ No newline at end of file diff --git a/HW_2/hw_2_4.py b/HW_2/hw_2_4.py new file mode 100644 index 0000000..5c06061 --- /dev/null +++ b/HW_2/hw_2_4.py @@ -0,0 +1,16 @@ +# 4. Пользователь вводит строку из нескольких слов, разделённых пробелами. +# Вывести каждое слово с новой строки. +# Строки необходимо пронумеровать. +# Если в слово длинное, выводить только первые 10 букв в слове. + +my_str = input("Enter any string: ") +my_word = [] +num = 1 +for el in range(my_str.count(' ') + 1): + my_word = my_str.split() + if len(str(my_word)) <= 10: + print(f" {num} {my_word[el]}") + num += 1 + else: + print(f" {num} {my_word[el][:10]}") + num += 1 diff --git a/HW_2/hw_2_5.py b/HW_2/hw_2_5.py new file mode 100644 index 0000000..3bc4d2a --- /dev/null +++ b/HW_2/hw_2_5.py @@ -0,0 +1,27 @@ +# 5. Реализовать структуру «Рейтинг», представляющую собой не возрастающий набор натуральных чисел. +# У пользователя необходимо запрашивать новый элемент рейтинга. +# Если в рейтинге существуют элементы с одинаковыми значениями, +# то новый элемент с тем же значением должен разместиться после них. +# Подсказка. Например, набор натуральных чисел: 7, 5, 3, 3, 2. +# Пользователь ввел число 3. Результат: 7, 5, 3, 3, 3, 2. +# Пользователь ввел число 8. Результат: 8, 7, 5, 3, 3, 2. +# Пользователь ввел число 1. Результат: 7, 5, 3, 3, 2, 1. +# Набор натуральных чисел можно задать непосредственно в коде, например, my_list = [7, 5, 3, 3, 2]. + + +number = int(input("Enter number: ")) +my_list = [7, 5, 3, 3, 2] +c = my_list.count(number) +for element in my_list: + if c > 0: + i = my_list.index(number) + my_list.insert(i + c, number) + break + else: + if number > element: + j = my_list.index(element) + my_list.insert(j, number) + break + elif number < my_list[len(my_list) - 1]: + my_list.append(number) +print(my_list) diff --git a/HW_2/hw_2_6.py b/HW_2/hw_2_6.py new file mode 100644 index 0000000..138509f --- /dev/null +++ b/HW_2/hw_2_6.py @@ -0,0 +1,41 @@ +# 6. * Реализовать структуру данных «Товары». +# Она должна представлять собой список кортежей. +# Каждый кортеж хранит информацию об отдельном товаре. +# В кортеже должно быть два элемента — номер товара и словарь с параметрами +# (характеристиками товара: название, цена, количество, единица измерения). +# Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя. +# Пример готовой структуры: +# [ +# (1, {“название”: “компьютер”, “цена”: 20000, “количество”: 5, “eд”: “шт.”}), +# (2, {“название”: “принтер”, “цена”: 6000, “количество”: 2, “eд”: “шт.”}), +# (3, {“название”: “сканер”, “цена”: 2000, “количество”: 7, “eд”: “шт.”}) +# ] +# Необходимо собрать аналитику о товарах. +# Реализовать словарь, в котором каждый ключ — характеристика товара, например название, +# а значение — список значений-характеристик, например список названий товаров. +# Пример: +# { +# “название”: [“компьютер”, “принтер”, “сканер”], +# “цена”: [20000, 6000, 2000], +# “количество”: [5, 2, 7], +# “ед”: [“шт.”] } + +goods = [] +while input("Would you like add product? Enter yes/no: ") == 'yes': + number = int(input("Enter product number: ")) + features = {} + while input("Would you like add product parameters? Enter yes/no: ") == 'yes': + feature_key = input("Enter feature product: ") + feature_value = input("Enter feature value product: ") + features[feature_key] = feature_value + goods.append(tuple([number, features])) +print(goods) +goods = [(1, {'name': 'comp', 'price': '11'}), (2, {'name': 'pri', 'price': '22'})] +analitics = {} +for good in goods: + for feature_key, feature_value in good[1].items(): + if feature_key in analitics: + analitics[feature_key].append(feature_value) + else: + analitics[feature_key] = [feature_value] +print(analitics) diff --git a/HW_3/hw_3_1.py b/HW_3/hw_3_1.py new file mode 100644 index 0000000..dbd8136 --- /dev/null +++ b/HW_3/hw_3_1.py @@ -0,0 +1,11 @@ +# 1. Реализовать функцию, принимающую два числа (позиционные аргументы) и выполняющую их деление. +# Числа запрашивать у пользователя, предусмотреть обработку ситуации деления на ноль. + +def division(num1, num2): + try: + return num1 / num2 + except ZeroDivisionError as err: + print('Error: ', err) + + +print(division(2, 4)) \ No newline at end of file diff --git a/HW_3/hw_3_2.py b/HW_3/hw_3_2.py new file mode 100644 index 0000000..1412c10 --- /dev/null +++ b/HW_3/hw_3_2.py @@ -0,0 +1,19 @@ +# 2. Реализовать функцию, принимающую несколько параметров, описывающих данные пользователя: +# имя, фамилия, год рождения, город проживания, email, телефон. +# Функция должна принимать параметры как именованные аргументы. +# Реализовать вывод данных о пользователе одной строкой. + +def user_info(name, surname, birth_date, city, email, phone): + return f"Name: {name}\n" \ + f'Surname: {surname}\n' \ + f"Birth date: {birth_date}\n" \ + f"City: {city}\n" \ + f"Email: {email}\n" \ + f"Phone number: {phone}" + +print(user_info(name="Andrey", + surname='Krylov', + birth_date='14.11.1988', + city='Moscow', + email="ak.chemp@gmail.com", + phone='+79779264986')) \ No newline at end of file diff --git a/HW_3/hw_3_3.py b/HW_3/hw_3_3.py new file mode 100644 index 0000000..680c72f --- /dev/null +++ b/HW_3/hw_3_3.py @@ -0,0 +1,8 @@ +# 3. Реализовать функцию my_func(), которая принимает три позиционных аргумента, +# и возвращает сумму наибольших двух аргументов. + +def sum_of_max(*args): + return sum(args) - min(args) + + +print(sum_of_max(0, 1, 2)) diff --git a/HW_3/hw_3_4.py b/HW_3/hw_3_4.py new file mode 100644 index 0000000..820b2c5 --- /dev/null +++ b/HW_3/hw_3_4.py @@ -0,0 +1,20 @@ +#4. Программа принимает действительное положительное число x и целое отрицательное число y. +# Необходимо выполнить возведение числа x в степень y. +# Задание необходимо реализовать в виде функции my_func(x, y). +# При решении задания необходимо обойтись без встроенной функции возведения числа в степень. +#: попробуйте решить задачу двумя способами. +# Первый — возведение в степень с помощью оператора **. +# Второй — более сложная реализация без оператора **, предусматривающая использование цикла. + +def power(base, pwr): + return 1 / (base ** pwr) + +def power2(base, pwr): + res = 1 + for n in range(pwr): + res *= base + return 1 / res + + +print(power(2, 5)) +print(power2(2, 5)) \ No newline at end of file diff --git a/HW_3/hw_3_5.py b/HW_3/hw_3_5.py new file mode 100644 index 0000000..ad0c89a --- /dev/null +++ b/HW_3/hw_3_5.py @@ -0,0 +1,24 @@ +5. # Программа запрашивает у пользователя строку чисел, разделенных пробелом. + + +# При нажатии Enter должна выводиться сумма чисел. +# Пользователь может продолжить ввод чисел, разделенных пробелом и снова нажать Enter. +# Сумма вновь введенных чисел будет добавляться к уже подсчитанной сумме. +# Но если вместо числа вводится специальный символ, выполнение программы завершается. +# Если специальный символ введен после нескольких чисел, +# то вначале нужно добавить сумму этих чисел к полученной ранее сумме и после этого завершить программу. + +def summator(): + total_sum = 0 + while True: + num_list = input('Enter numbers: ') + stopper = num_list.count('!') # считаем кол-во стоп символов в строке + if stopper: + total_sum += sum(map(int, num_list[:num_list.index('!') - 1].split())) + break + total_sum += sum(map(int, num_list.split())) + print(f'Temporary sum value: {total_sum}') + return total_sum + + +print(summator()) diff --git a/HW_3/hw_3_6.py b/HW_3/hw_3_6.py new file mode 100644 index 0000000..ecdc86e --- /dev/null +++ b/HW_3/hw_3_6.py @@ -0,0 +1,13 @@ +"""6. Реализовать функцию int_func(), принимающую слово из маленьких латинских букв и возвращающую его же, +но с прописной первой буквой. +Например, print(int_func(‘text’)) -> Text. +Продолжить работу над заданием. В программу должна попадать строка из слов, разделенных пробелом. +Каждое слово состоит из латинских букв в нижнем регистре. Сделать вывод исходной строки, +но каждое слово должно начинаться с заглавной буквы. Необходимо использовать написанную ранее функцию int_func().""" + + +def int_func(word): + return word.capitalize() + +word_string = input('Enter the words: ') +print(' '.join(list(map(int_func, word_string.split())))) diff --git a/HW_4/hw_4_1.py b/HW_4/hw_4_1.py new file mode 100644 index 0000000..f9f78e5 --- /dev/null +++ b/HW_4/hw_4_1.py @@ -0,0 +1,15 @@ +"""1. Реализовать скрипт, в котором должна быть предусмотрена функция расчета заработной платы сотрудника. + В расчете необходимо использовать формулу: (выработка в часах * ставка в час) + премия. + Для выполнения расчета для конкретных значений необходимо запускать скрипт с параметрами.""" + +from sys import argv + + +def salary(time, stavka, premia): + try: + return time * stavka + premia + except ValueError as err: + print('Error: ', err) + + +print(f'Salary - {salary(*map(int, argv[1:]))}') diff --git a/HW_4/hw_4_2.py b/HW_4/hw_4_2.py new file mode 100644 index 0000000..29d6704 --- /dev/null +++ b/HW_4/hw_4_2.py @@ -0,0 +1,12 @@ +"""2. Представлен список чисел. Необходимо вывести элементы исходного списка, + значения которых больше предыдущего элемента. +Подсказка: элементы, удовлетворяющие условию, оформить в виде списка. + Для формирования списка использовать генератор. +Пример исходного списка: [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]. +Результат: [12, 44, 4, 10, 78, 123].""" + + +my_list = [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55] +more_then = [my_list[num] for num in range(1, len(my_list)) if my_list[num] > my_list[num - 1]] +print(more_then) + diff --git a/HW_4/hw_4_3.py b/HW_4/hw_4_3.py new file mode 100644 index 0000000..5d4a10d --- /dev/null +++ b/HW_4/hw_4_3.py @@ -0,0 +1,5 @@ +"""3. Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21. Необходимо решить задание в одну строку. +Подсказка: использовать функцию range() и генератор.""" + +uniq_list = [el for el in range(20, 241) if el % 20 == 0 or el % 21 == 0] +print(uniq_list) \ No newline at end of file diff --git a/HW_4/hw_4_4.py b/HW_4/hw_4_4.py new file mode 100644 index 0000000..baaa0b0 --- /dev/null +++ b/HW_4/hw_4_4.py @@ -0,0 +1,13 @@ +"""4. Представлен список чисел. Определить элементы списка, не имеющие повторений. +Сформировать итоговый массив чисел, соответствующих требованию. +Элементы вывести в порядке их следования в исходном списке. + Для выполнения задания обязательно использовать генератор. +Пример исходного списка: [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11]. +Результат: [23, 1, 3, 10, 4, 11]""" + +from random import randint + +my_list = [randint(-10, 10) for i in range(20)] +# my_list = [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11] +uniq_list = [el for el in my_list if my_list.count(el) == 1] +print(f'Source list\n{my_list}\nNo rep list\n{uniq_list}') diff --git a/HW_4/hw_4_5.py b/HW_4/hw_4_5.py new file mode 100644 index 0000000..1afad24 --- /dev/null +++ b/HW_4/hw_4_5.py @@ -0,0 +1,14 @@ +"""5. Реализовать формирование списка, используя функцию range() и возможности генератора. + В список должны войти четные числа от 100 до 1000 (включая границы). + Необходимо получить результат вычисления произведения всех элементов списка. +Подсказка: использовать функцию reduce().""" + +from functools import reduce + + +def mul_list(el_1, el_2): + return el_1 * el_2 + + +uniq_list = [el for el in range(100, 1001, 2)] +print(f'List\n{uniq_list}\nMultip of numbers\n{reduce(mul_list, uniq_list)}') diff --git a/HW_4/hw_4_6.py b/HW_4/hw_4_6.py new file mode 100644 index 0000000..a46c9d8 --- /dev/null +++ b/HW_4/hw_4_6.py @@ -0,0 +1,27 @@ +"""6. Реализовать два небольших скрипта: +а) итератор, генерирующий целые числа, начиная с указанного, +б) итератор, повторяющий элементы некоторого списка, определенного заранее. +Подсказка: использовать функцию count() и cycle() модуля itertools. +Обратите внимание, что создаваемый цикл не должен быть бесконечным. Необходимо предусмотреть условие его завершения. +Например, в первом задании выводим целые числа, начиная с 3, а при достижении числа 10 завершаем цикл. +Во втором также необходимо предусмотреть условие, при котором повторение элементов списка будет прекращено.""" + +from itertools import count, cycle + +print("The program generates integers starting from the specified one. To generate a number" + "You must press Enter. For exit - q") +for i in count(int(input('Enter start number: '))): + print(i, end='') + quit = input() + if quit == 'q': + break + +print("The program repeats the elements of the list. To generate the next repetition" + "press Enter, to exit - enter q.") +u_list = input("enter a list, separating the items with a space: ").split() +iter = cycle(u_list) +quit = None + +while quit != 'q': + print(next(iter), end='') + quit = input() \ No newline at end of file diff --git a/HW_4/hw_4_7.py b/HW_4/hw_4_7.py new file mode 100644 index 0000000..36a8b6d --- /dev/null +++ b/HW_4/hw_4_7.py @@ -0,0 +1,16 @@ +"""7. Реализовать генератор с помощью функции с ключевым словом yield, создающим очередное значение. + При вызове функции должен создаваться объект-генератор. Функция должна вызываться следующим образом: for el in fact(n). +Функция отвечает за получение факториала числа, + а в цикле необходимо выводить только первые n чисел, начиная с 1! и до n!. +Подсказка: факториал числа n — произведение чисел от 1 до n. Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24.""" + + +def fact_gen(number): + f_num = 1 + for i in range(1, number + 1): + f_num *= i + yield f_num + + +for el in fact_gen(5): + print(el) diff --git a/HW_5/hw_5_1.py b/HW_5/hw_5_1.py new file mode 100644 index 0000000..119a3ed --- /dev/null +++ b/HW_5/hw_5_1.py @@ -0,0 +1,11 @@ +"""1. Создать программно файл в текстовом формате, записать в него построчно данные, +вводимые пользователем. Об окончании ввода данных свидетельствует пустая строка.""" + + +with open('task_1.txt', "w") as f_o: + while True: + line = f"{input('Enter a text: ')}\n" + """Можно использовать пустую строку, тоже будет работать""" + if line == "\n": + break + f_o.write(line) \ No newline at end of file diff --git a/HW_5/hw_5_2.py b/HW_5/hw_5_2.py new file mode 100644 index 0000000..8073e63 --- /dev/null +++ b/HW_5/hw_5_2.py @@ -0,0 +1,10 @@ +"""2. Создать текстовый файл (не программно), сохранить в нем несколько строк, +выполнить подсчет количества строк, количества слов в каждой строке.""" + +with open('task_2.txt', "r") as f: + lines = f.readlines() + print(f"Всего строк: {len(lines)}") + for line in lines: + """чтобы не захватывать перенос, берем до последнего элемента""" + + print(f'"{line[:-1]}" СЛОВ В СТРОКЕ - {len(line)}') diff --git a/HW_5/hw_5_3.py b/HW_5/hw_5_3.py new file mode 100644 index 0000000..a9b8fe8 --- /dev/null +++ b/HW_5/hw_5_3.py @@ -0,0 +1,17 @@ +"""3. Создать текстовый файл (не программно), построчно записать фамилии сотрудников и величину их окладов. +Определить, кто из сотрудников имеет оклад менее 20 тыс., вывести фамилии этих сотрудников. +Выполнить подсчет средней величины дохода сотрудников.""" + + +incomes = [] +with open('task_3.txt', 'r') as f: + lines = f.readlines() + + for line in lines: + name, income = line.split(",") + income = int(income) + incomes.append(income) + if income < 20000: + print(name) + print(sum(incomes) / len(incomes)) + diff --git a/HW_5/hw_5_4.py b/HW_5/hw_5_4.py new file mode 100644 index 0000000..18cc698 --- /dev/null +++ b/HW_5/hw_5_4.py @@ -0,0 +1,20 @@ +"""4. Создать (не программно) текстовый файл со следующим содержимым: +One — 1 +Two — 2 +Three — 3 +Four — 4 +Необходимо написать программу, открывающую файл на чтение и считывающую построчно данные. +При этом английские числительные должны заменяться на русские. +Новый блок строк должен записываться в новый текстовый файл.""" + + +num_dict = {'One': 'Один', + "Two": 'Два', + "Three": "Три", + "Four": "Четыре"} +with open("task_4_1.txt", "r") as f: + with open("task_4_2.txt", "w") as final_f: + lines = f.readlines() + for line in lines: + num_list = line.split(" - ") + final_f.write(f"{num_dict[num_list[0]]} - {num_list[1]}") \ No newline at end of file diff --git a/HW_5/hw_5_5.py b/HW_5/hw_5_5.py new file mode 100644 index 0000000..75e9af4 --- /dev/null +++ b/HW_5/hw_5_5.py @@ -0,0 +1,9 @@ +"""5. Создать (программно) текстовый файл, записать в него программно набор чисел, разделенных пробелами. +Программа должна подсчитывать сумму чисел в файле и выводить ее на экран.""" +with open("task_4.txt", "w") as f: + num = f"{input('Введите числа через пробел: ')}" + f.write(num) +with open("task_4.txt", "r") as f: + main_line = f.readline() + main_list = map(int, main_line.split()) + print(sum(main_list)) \ No newline at end of file diff --git a/HW_5/hw_5_6.py b/HW_5/hw_5_6.py new file mode 100644 index 0000000..f70bb62 --- /dev/null +++ b/HW_5/hw_5_6.py @@ -0,0 +1,22 @@ +""" +6. Необходимо создать (не программно) текстовый файл, +каждая строка описывает учебный предмет и наличие лекционных, +практических и лабораторных занятий по этому предмету и их количество. +Важно, чтобы для каждого предмета не обязательно были все типы занятий. +Сформировать словарь, содержащий название предмета и общее количество занятий по нему. Вывести словарь на экран. +Примеры строк файла: +Информатика: 100(л) 50(пр) 20(лаб). +Физика: 30(л) — 10(лаб) +Физкультура: — 30(пр) — + +Прсловаря:имер +{“Информатика”: 170, “Физика”: 40, “Физкультура”: 30} +""" + +my_dict = {} +with open("task_6.txt") as f: + for line in f: + name, stats = line.split(':') + name_sum = sum(map(int, "".join([i for i in stats if i == " " or i.isdigit()]).split())) + my_dict[name] = name_sum + print(my_dict) diff --git a/HW_5/hw_5_7.py b/HW_5/hw_5_7.py new file mode 100644 index 0000000..420c04b --- /dev/null +++ b/HW_5/hw_5_7.py @@ -0,0 +1,34 @@ +"""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 + +with open("task_7.json", "w") as j_f: + with open("task_7.txt", "r") as f: + subjects = {} + analytics = {} + total_profit, profitable_cmp = 0, 0 + lines = f.read().split("\n") + for company_info in lines: + company_info = company_info.split() + profit = int(company_info[2]) - int(company_info[3]) + subjects[company_info[0]] = profit + if profit > 0: + total_profit += profit + profitable_cmp += 1 + analytics["avegare"] = total_profit / profitable_cmp + all_list = [subjects, analytics] + json.dump(all_list, j_f) + +# в файле имя фирмы и ее денежные показатели \ No newline at end of file diff --git a/HW_5/task_2.txt b/HW_5/task_2.txt new file mode 100644 index 0000000..711cda7 --- /dev/null +++ b/HW_5/task_2.txt @@ -0,0 +1,24 @@ +"Как сияет это солнце, +Как спокойно это море.. +Улыбнись и не грусти. +В этом мире быть не может +Ни беды, ни зла, ни горя +Боже мой, не допусти.. +С нашей верой и любовью, +Перед небом и тобою +Ты же знаешь мы чисты +О боже мой – не допусти! +Я тебя заклинаю жизнью моей! +Дай мне надежду, +Мою печаль развей… + +Ну неужели не возможно +Счастье и любовь без боли, +И без слез во тьме ночей… +О боже мой - ты не допусти +Я тебя заклинаю жизнью моей +Дай мне надежду, +Мою печаль развей… +Милый мой, я жду тебя… +Боже помоги, Боже сохрани.. +Мой милый, я жду, я жду…" \ No newline at end of file diff --git a/HW_5/task_3.txt b/HW_5/task_3.txt new file mode 100644 index 0000000..d8ab82d --- /dev/null +++ b/HW_5/task_3.txt @@ -0,0 +1,5 @@ +Иванов,20000 +Петров,30000 +Крылов,40000 +Чепаев,10000 +Копаев, 11000 \ No newline at end of file diff --git a/HW_5/task_4_1.txt b/HW_5/task_4_1.txt new file mode 100644 index 0000000..aca55a2 --- /dev/null +++ b/HW_5/task_4_1.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Three — 3 +Four — 4 \ No newline at end of file diff --git a/HW_6/hw_6_1.py b/HW_6/hw_6_1.py new file mode 100644 index 0000000..1a43605 --- /dev/null +++ b/HW_6/hw_6_1.py @@ -0,0 +1,43 @@ +"""1. Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) и метод running (запуск). + Атрибут реализовать как приватный. + В рамках метода реализовать переключение светофора в режимы: красный, желтый, зеленый. + Продолжительность первого состояния + (красный) составляет 7 секунд, второго (желтый) — 2 секунды, третьего (зеленый) — на ваше усмотрение. + Переключение между режимами должно осуществляться только в указанном порядке (красный, желтый, зеленый). + Проверить работу примера, создав экземпляр и вызвав описанный метод. +Задачу можно усложнить, реализовав проверку порядка режимов, +и при его нарушении выводить соответствующее сообщение и завершать скрипт.""" + + +from itertools import cycle +from time import sleep + + +class TrafficLight: + __colors = {"Красный": 7, "Желтый": 2, "Зеленый": 7} + prev_colors = {"Красный": "Зеленый", 'Зеленый': 'Желтый', "Желтый": "Красный"} + + def running(self, run_count): + colors_iteration = cycle(self.__colors) + prev_color = "Зеленый" + while run_count: + current_light_value = next(colors_iteration) + if TrafficLight.prev_colors[current_light_value] != prev_color: + raise ValueError("Наружен порядок!") + print(f"Сейчас горит сигнал: {current_light_value} " + f"{TrafficLight.__colors[current_light_value]} сек." + f"(Предыдущий: {prev_color})") + sleep(self.__colors[current_light_value]) + prev_color = current_light_value + run_count -= 1 + + def get_colors(self, keyword): + if keyword == "админ пароль": + return self.__colors + else: + ValueError("Ошибка авторизации") + + +traffic_light = TrafficLight() +traffic_light.running(5) +print(traffic_light.get_colors("админ пароль")) diff --git a/HW_6/hw_6_2.py b/HW_6/hw_6_2.py new file mode 100644 index 0000000..2a30a11 --- /dev/null +++ b/HW_6/hw_6_2.py @@ -0,0 +1,19 @@ +"""2. Реализовать класс Road (дорога), в котором определить атрибуты: length (длина), width (ширина). + Значения данных атрибутов должны передаваться при создании экземпляра класса. Атрибуты сделать защищенными. + Определить метод расчета массы асфальта, необходимого для покрытия всего дорожного полотна. + Использовать формулу: длина * ширина * масса асфальта для покрытия одного кв метра дороги асфальтом, + толщиной в 1 см * чи сло см толщины полотна. Проверить работу метода. + Например: 20м * 5000м * 25кг * 5см = 12500 т""" + + +class Road: + def __init__(self, length, width): + self._length = length + self._width = width + + def calculate_mass(self, mass_1cm, layer_cm): + return self._length * self._width * mass_1cm * layer_cm + + +road = Road(100, 200) +print(road.calculate_mass(10, 20)) diff --git a/HW_6/hw_6_3.py b/HW_6/hw_6_3.py new file mode 100644 index 0000000..7e77f8c --- /dev/null +++ b/HW_6/hw_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 get_full_name(self): + return f"{self.name} {self.surname}" + + def get_total_income(self): + return self._income["wage"] + self._income["bonus"] + + +position = Position(name="Andrey", + surname="Krylov", + position="student", + income={"wage": 10000000, + "bonus": 1000000}) + +print(position.get_full_name()) +print(position.get_total_income()) diff --git a/HW_6/hw_6_4.py b/HW_6/hw_6_4.py new file mode 100644 index 0000000..f82a8e9 --- /dev/null +++ b/HW_6/hw_6_4.py @@ -0,0 +1,81 @@ +""" +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: + __compass = {0: "North", + 1: "East", + 2: "South", + 3: "West"} + + def __init__(self, speed: int, color: str, name: str, is_police: bool): + self.speed = speed + self.color = color + self.name = name + self.is_police = is_police + self.condition = {"is_moving": False, "direction": 0} + + def go(self): + self.condition['is_moving'] = True + + def stop(self): + self.condition["is_moving"] = False + + def turn(self, direction): + if direction.lower() not in {"left, right"}: + raise ValueError("Введите корректное значение для поворота.") + elif direction == "left": + self.condition["direction"] = (self.condition['direction'] + 3) % 4 + elif direction == "right": + self.condition["direction"] = (self.condition["direction"] + 5) % 4 + + def show_speed(self): + return {"speed": self.speed, "messages": []} + + def show_direction(self): + return Car.__compass[self.condition['direction']] + + +class AbstractVillageCar(Car): + speed_limit = 0 + + def show_speed(self): + speed_info = super().show_speed() + if speed_info["speed"] > self.speed_limit: + speed_info["messages"].append("Вы превышаете скорость!") + return speed_info + + +class TownCar(AbstractVillageCar): + speed_limit = 60 + + +class SportCar(Car): + pass + + +class PoliceCar(Car): + pass + + +class WorkCar(AbstractVillageCar): + speed_limit = 40 + + +car = WorkCar(speed=150, color="red", name="ford", is_police=False) +car.turn("right") +print(car.show_direction()) +car.turn("right") +print(car.show_direction()) +car.turn("left") +print(car.show_direction()) +car.turn("left") +print(car.show_direction()) + +print(car.show_speed()) diff --git a/HW_6/hw_6_5.py b/HW_6/hw_6_5.py new file mode 100644 index 0000000..e62c751 --- /dev/null +++ b/HW_6/hw_6_5.py @@ -0,0 +1,29 @@ +"""5. Реализовать класс Stationery (канцелярская принадлежность). +Определить в нем атрибут title (название) и метод draw (отрисовка). +Метод выводит сообщение “Запуск отрисовки.” Создать три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер). +В каждом из классов реализовать переопределение метода draw. +Для каждого из классов методы должен выводить уникальное сообщение. +Создать экземпляры классов и проверить, что выведет описанный метод для каждого экземпляра.""" + +class Stationery: + def draw(self): + return "Пишем" + + +class Pen(Stationery): + def draw(self): + return f"{super().draw()} ручкой" + + +class Pencil(Stationery): + def draw(self): + return f"{super().draw()} карандашом" + + +class Handle(Stationery): + def draw(self): + return f"{super().draw()} фломастером" + + +pen = Pen() +print(pen.draw())