From f7dd57e9bd9c050061bc6e3380658af180eb84ef Mon Sep 17 00:00:00 2001 From: Akchemp Date: Fri, 22 Jan 2021 22:29:57 +0300 Subject: [PATCH 1/6] =?UTF-8?q?[upd]=20=D0=B2=D1=82=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_2/hw_2_1.py | 15 +++++++++++++++ HW_2/hw_2_2.py | 18 ++++++++++++++++++ HW_2/hw_2_3.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ HW_2/hw_2_4.py | 16 ++++++++++++++++ HW_2/hw_2_5.py | 27 +++++++++++++++++++++++++++ HW_2/hw_2_6.py | 41 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 167 insertions(+) create mode 100644 HW_2/hw_2_1.py create mode 100644 HW_2/hw_2_2.py create mode 100644 HW_2/hw_2_3.py create mode 100644 HW_2/hw_2_4.py create mode 100644 HW_2/hw_2_5.py create mode 100644 HW_2/hw_2_6.py 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) From 10cc92631b9d6cea14c5509f12928ce96a49ddae Mon Sep 17 00:00:00 2001 From: Akchemp Date: Mon, 25 Jan 2021 18:04:59 +0300 Subject: [PATCH 2/6] =?UTF-8?q?[upd]=20=D0=A2=D1=80=D0=B5=D1=82=D1=8C?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_3/hw_3_1.py | 11 +++++++++++ HW_3/hw_3_2.py | 19 +++++++++++++++++++ HW_3/hw_3_3.py | 8 ++++++++ HW_3/hw_3_4.py | 20 ++++++++++++++++++++ HW_3/hw_3_5.py | 24 ++++++++++++++++++++++++ HW_3/hw_3_6.py | 13 +++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 HW_3/hw_3_1.py create mode 100644 HW_3/hw_3_2.py create mode 100644 HW_3/hw_3_3.py create mode 100644 HW_3/hw_3_4.py create mode 100644 HW_3/hw_3_5.py create mode 100644 HW_3/hw_3_6.py 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())))) From b6f24ee4de36b7000d11ae44cb72f3012d819f72 Mon Sep 17 00:00:00 2001 From: Akchemp Date: Thu, 28 Jan 2021 16:24:03 +0300 Subject: [PATCH 3/6] =?UTF-8?q?[upd]=20=D0=A7=D0=B5=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=82=D0=B0=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_4/hw_4_1.py | 15 +++++++++++++++ HW_4/hw_4_2.py | 12 ++++++++++++ HW_4/hw_4_3.py | 5 +++++ HW_4/hw_4_4.py | 13 +++++++++++++ HW_4/hw_4_5.py | 14 ++++++++++++++ HW_4/hw_4_6.py | 27 +++++++++++++++++++++++++++ HW_4/hw_4_7.py | 16 ++++++++++++++++ 7 files changed, 102 insertions(+) create mode 100644 HW_4/hw_4_1.py create mode 100644 HW_4/hw_4_2.py create mode 100644 HW_4/hw_4_3.py create mode 100644 HW_4/hw_4_4.py create mode 100644 HW_4/hw_4_5.py create mode 100644 HW_4/hw_4_6.py create mode 100644 HW_4/hw_4_7.py 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) From 40dc246b99a8b7d5d165459080b1e585531f26f8 Mon Sep 17 00:00:00 2001 From: Akchemp Date: Mon, 1 Feb 2021 14:19:57 +0300 Subject: [PATCH 4/6] =?UTF-8?q?[upd]=20=D0=9F=D1=8F=D1=82=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_5/hw_5_1.py | 11 +++++++++++ HW_5/hw_5_2.py | 10 ++++++++++ HW_5/hw_5_3.py | 17 +++++++++++++++++ HW_5/hw_5_4.py | 20 ++++++++++++++++++++ HW_5/hw_5_5.py | 9 +++++++++ HW_5/hw_5_6.py | 22 ++++++++++++++++++++++ HW_5/hw_5_7.py | 34 ++++++++++++++++++++++++++++++++++ HW_5/task_2.txt | 24 ++++++++++++++++++++++++ HW_5/task_3.txt | 5 +++++ HW_5/task_4_1.txt | 4 ++++ 10 files changed, 156 insertions(+) create mode 100644 HW_5/hw_5_1.py create mode 100644 HW_5/hw_5_2.py create mode 100644 HW_5/hw_5_3.py create mode 100644 HW_5/hw_5_4.py create mode 100644 HW_5/hw_5_5.py create mode 100644 HW_5/hw_5_6.py create mode 100644 HW_5/hw_5_7.py create mode 100644 HW_5/task_2.txt create mode 100644 HW_5/task_3.txt create mode 100644 HW_5/task_4_1.txt 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 From b9d6698f039f34748888e1cca9c673934be0f68f Mon Sep 17 00:00:00 2001 From: Akchemp Date: Thu, 4 Feb 2021 16:59:04 +0300 Subject: [PATCH 5/6] =?UTF-8?q?[upd]=20=D0=A8=D0=B5=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_6/hw_6_1.py | 43 +++++++++++++++++++++++++++ HW_6/hw_6_2.py | 19 ++++++++++++ HW_6/hw_6_3.py | 35 ++++++++++++++++++++++ HW_6/hw_6_4.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ HW_6/hw_6_5.py | 29 ++++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100644 HW_6/hw_6_1.py create mode 100644 HW_6/hw_6_2.py create mode 100644 HW_6/hw_6_3.py create mode 100644 HW_6/hw_6_4.py create mode 100644 HW_6/hw_6_5.py 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()) From 24eb88e45ee4fd1037246597c973fadd33f57bfd Mon Sep 17 00:00:00 2001 From: Akchemp Date: Mon, 26 Apr 2021 12:26:14 +0300 Subject: [PATCH 6/6] =?UTF-8?q?[upd]=20=D0=A1=D0=B5=D0=B4=D1=8C=D0=BC?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HW_7/hw_7_1.py | 38 +++++++++++++++++++++++++++++++++++ HW_7/hw_7_2.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++ HW_7/hw_7_3.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 HW_7/hw_7_1.py create mode 100644 HW_7/hw_7_2.py create mode 100644 HW_7/hw_7_3.py diff --git a/HW_7/hw_7_1.py b/HW_7/hw_7_1.py new file mode 100644 index 0000000..f828b39 --- /dev/null +++ b/HW_7/hw_7_1.py @@ -0,0 +1,38 @@ +"""1. Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод __init__()), +который должен принимать данные (список списков) для формирования матрицы. +Подсказка: матрица — система некоторых математических величин, расположенных в виде прямоугольной схемы. +Примеры матриц вы найдете в методичке. +Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix (двух матриц) +. Результатом сложения должна быть новая матрица. +Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой матрицы складываем с +первым элементом первой строки второй матрицы и т.д.""" + + +class Matrix: + def __init__(self, lists): + self.lists = lists + + def __str__(self): + return "\n".join(map(str, self.lists)) + + def __add__(self, other): + result = [] + for i in range(len(self.lists)): + result.append([]) + for j in range(len(self.lists[0])): + result[i].append(self.lists[i][j] + other.lists[i][j]) + return Matrix(result) + + +a = [[5, 3, 1, 6], + [4, 4, 4, 5], + [9, 0, 5, 0]] + +b = [[1, 1, 1, 2], + [2, 2, 2, 2], + [3, 3, 3, 1]] + +mtrx_1 = Matrix(a) +mtrx_2 = Matrix(b) +print(mtrx_1 + mtrx_2) diff --git a/HW_7/hw_7_2.py b/HW_7/hw_7_2.py new file mode 100644 index 0000000..7f89ce3 --- /dev/null +++ b/HW_7/hw_7_2.py @@ -0,0 +1,51 @@ +"""2. Реализовать проект расчета суммарного расхода ткани на производство одежды. Основная сущность (класс) этого +проекта — одежда, которая может иметь определенное название. К типам одежды в этом проекте относятся пальто и костюм. + У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). + Это могут быть обычные числа:V и H, соответственно. +Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + 0.5), +для костюма (2 * H + 0.3). Проверить работу этих методов на реальных данных. +Реализовать общий подсчет расхода ткани. Проверить на практике полученные на этом уроке знания: +реализовать абстрактные классы для основных классов проекта, проверить на практике работу декоратора @property.""" + +from abc import ABC, abstractmethod + + +class Clothes(ABC): + + @staticmethod + def count_total(cloth_list): + return sum(shmotka.consumption for shmotka in cloth_list) + + @abstractmethod + def consumption(self): + pass + + def __add__(self, other): + return self.consumption + other.consumption + + +class Coat(Clothes): + def __init__(self, height): + self.height = height + + @property + def consumption(self): + print(f"Consumption of fabric for sewing a coat - {round(self.height / 6.5) + 0.5}") + return round(self.height / 6.5) + 0.5 + + +class Costume(Clothes): + def __init__(self, param): + self.param = param + + @property + def consumption(self): + print(f"Consumption of fabric for sewing a costume - {round(2 * self.param + 0.3) / 0.5}") + return (2 * self.param + 0.3) / 100 + + +coat1 = Coat(10) +coat2 = Coat(20) +costume = Costume(30) +shmot = [coat1, coat2, costume] +print(Clothes.count_total(shmot)) diff --git a/HW_7/hw_7_3.py b/HW_7/hw_7_3.py new file mode 100644 index 0000000..c3195ce --- /dev/null +++ b/HW_7/hw_7_3.py @@ -0,0 +1,54 @@ +"""3. Реализовать программу работы с органическими клетками. Необходимо создать класс Клетка. +В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число). +В классе должны быть реализованы методы перегрузки арифметических операторов: сложение (__add__()), +вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()).Данные методы должны применяться только +к клеткам и выполнять увеличение, уменьшение, умножение и обычное (не целочисленное) деление клеток, соответственно. + В методе деления должно осуществляться округление значения до целого числа. +Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. +Вычитание. Участвуют две клетки. Операцию необходимо выполнять +только если разность количества ячеек двух клеток больше нуля, иначе выводить соответствующее сообщение. +Умножение. Создается общая клетка из двух. +Число ячеек общей клетки определяется как произведение количества ячеек этих двух клеток. +Деление. Создается общая клетка из двух. + Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток. +В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и количество ячеек в ряду. +Данный метод позволяет организовать ячейки по рядам. +Метод должен возвращать строку вида *****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу. +Если ячеек на формирование ряда не хватает, то в последний ряд записываются все оставшиеся. +Например, количество ячеек клетки равняется 12, +количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: *****\n*****\n**. +Или, количество ячеек клетки равняется 15, количество ячеек в ряду — 5. +Тогда метод make_order() вернет строку: *****\n*****\n*****.""" + + +class Cell: + def __init__(self, nums): + self.nums = nums + + def make_order(self, rows): + bufstr = "\n".join(["*" * rows for _ in range(self.nums // rows)]) + return f'{bufstr}\n{"*" * (self.nums % rows)}' + + def __str__(self): + return str(self.nums) + + def __add__(self, other): + return Cell(self.nums + other.nums) + + def __sub__(self, other): + if self.nums - other.nums > 0: + return Cell(self.nums - other.nums) + raise ValueError("Вычетание невозможно. Ячеек в первой клетке меньше.") + + def __mul__(self, other): + return Cell(self.nums * other.nums) + + def __truediv__(self, other): + return Cell(round(self.nums / other.nums)) + + +cell1 = Cell(30) +print(cell1.make_order(10)) +cell2 = Cell(20) +cell3 = cell1 + cell2 +print(cell3)