diff --git a/lesson_1/task_1_1.py b/lesson_1/task_1_1.py new file mode 100644 index 0000000..097edd1 --- /dev/null +++ b/lesson_1/task_1_1.py @@ -0,0 +1,14 @@ +""" +Задание 1. +Поработайте с переменными, создайте +несколько, выведите на экран. +Запросите у пользователя некоторые числа и +строки и сохраните в переменные, +затем выведитена экран. +""" + + +name = input('Напиши как тебя зовут?: ') +print(f'Привет {name}') +n = int(input('А сколько тебе лет: ')) +print(f'Тебя зовут {name} и тебе {n} лет') diff --git a/lesson_1/task_1_2.py b/lesson_1/task_1_2.py new file mode 100644 index 0000000..a242d5e --- /dev/null +++ b/lesson_1/task_1_2.py @@ -0,0 +1,14 @@ +""" +Задание 2. +Пользователь вводит время в секундах. +Переведите время в часы, минуты, +секунды и выведите в формате чч:мм:сс. +Используйте форматирование строк. +""" + + +time = int(input("Введите время в секундах: ")) +hours = time // 3600 +minutes = (time - hours * 3600) // 60 +seconds = time - (hours * 3600 + minutes * 60) +print(f"Время в формате чч:мм:сс {hours}:{minutes}:{seconds}") diff --git a/lesson_1/task_1_3.py b/lesson_1/task_1_3.py new file mode 100644 index 0000000..634e30f --- /dev/null +++ b/lesson_1/task_1_3.py @@ -0,0 +1,12 @@ +""" +Задание 3. +Узнайте у пользователя число n. +Найдите сумму чисел n + nn + nnn. +Например, пользователь ввёл число 3. +Считаем 3 + 33 + 333 = 369. +""" + + +n = int(input("Введите число n: ")) +summ = (n + int(str(n) + str(n)) + int(str(n) + str(n) + str(n))) +print(f"Сумма чисел n + nn + nnn = {summ}") diff --git a/lesson_1/task_1_4.py b/lesson_1/task_1_4.py new file mode 100644 index 0000000..fadade5 --- /dev/null +++ b/lesson_1/task_1_4.py @@ -0,0 +1,19 @@ +""" +Задание 4. +Пользователь вводит целое положительное +число. Найдите самую большую цифру в числе. +Для решения используйте цикл while и +арифметические операции. +""" + + +num = int(input('Введите целое число: ')) +maxx = 0 +list_of_num = [int(i) for i in str(num)] + +while list_of_num: + n = list_of_num.pop() + maxx = n if n > maxx else maxx + if maxx == 9: + break +print(f'Максимальная цифра: {maxx}') diff --git a/lesson_1/task_1_5.py b/lesson_1/task_1_5.py new file mode 100644 index 0000000..38d62db --- /dev/null +++ b/lesson_1/task_1_5.py @@ -0,0 +1,19 @@ +""" +Задание 5. +Запросите у пользователя значения выручки и издержек фирмы. +Определите, с каким финансовым результатом +работает фирма. Например, прибыль — выручка +больше издержек, или убыток — издержки больше выручки. +Выведите соответствующее сообщение. +""" + + +v = int(input('Введите выручку компании: ')) +cost = int(input('Введите зе издержек компании: ')) +profit = v - cost +if profit > 0: + print('Компания прибыльная') +elif profit < 0: + print('Компания убыточная') +else: + print('Компания работает в ноль') diff --git a/lesson_1/task_1_6.py b/lesson_1/task_1_6.py new file mode 100644 index 0000000..a9633f0 --- /dev/null +++ b/lesson_1/task_1_6.py @@ -0,0 +1,22 @@ +""" +Задание 6. +Если фирма отработала с прибылью, вычислите +рентабельность выручки. Это отношение прибыли +к выручке. Далее запросите численность сотрудников +фирмы и определите прибыль фирмы в +расчёте на одного сотрудника. +""" + + +v = int(input('Введите выручку компании: ')) +cost = int(input('Введите зе издержек компании: ')) +profit = v - cost +if profit > 0: + print(f'Компания прибыльная, рентабельность: {profit / v}') + workers = int(input('Введите кол-во сотрудников: ')) + print('Прибыль компании в пересчете на ' + f'одного сотрудника составляет {profit / workers}') +elif profit < 0: + print(f'Убыток компании: {profit}') +else: + print('Компания работает в ноль') diff --git a/lesson_1/task_1_7.py b/lesson_1/task_1_7.py new file mode 100644 index 0000000..664f58d --- /dev/null +++ b/lesson_1/task_1_7.py @@ -0,0 +1,24 @@ +""" +Задание 7. +Спортсмен занимается ежедневными пробежками. +В первый день его результат составил a километров. +Каждый день спортсмен увеличивал результат на 10% +относительно предыдущего. Требуется определить +номер дня, на который результат спортсмена составит +не менее b километров. Программа должна принимать +значения параметров a и b и выводить одно +натуральное число — номер дня. +""" + + +a = int(input('Введите зачение а киллометров: ')) +b = int(input('Введите зачение b киллометров: ')) +distance = a +day = 1 +while True: + if distance >= b: + break + else: + distance += distance * 0.1 + day += 1 +print(f'На {day} день спортсмен достигнет поставленной цели') diff --git a/lesson_2/task_2_1.py b/lesson_2/task_2_1.py new file mode 100644 index 0000000..8d11fd2 --- /dev/null +++ b/lesson_2/task_2_1.py @@ -0,0 +1,12 @@ +""" +Задание 1. +Создать список и заполнить его элементами различных типов +данных. Реализовать скрипт проверки типа данных каждого +элемента. Использовать функцию type() для проверки типа. +Элементы списка можно не запрашивать у +пользователя, ауказать явно, в программе. +""" + +my_list = [5, 3.5, False, 'слон', (5, 20), [14, 23, 55]] +for el in my_list: + print(el, type(el)) diff --git a/lesson_2/task_2_2.py b/lesson_2/task_2_2.py new file mode 100644 index 0000000..916c96d --- /dev/null +++ b/lesson_2/task_2_2.py @@ -0,0 +1,18 @@ +""" +Задание 2. +Для списка реализовать обмен значений соседних элементов. +Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т. д. +При нечётном количестве элементов последний сохранить на своём месте. +Для заполнения списка элементов нужно использовать функцию input(). +""" + + +my_list = [int(i) for i in input('Введите числа через пробел: ').split()] +print(f'Полученный список: {my_list}') +i = 0 +while True: + if i >= len(my_list) - 1: + break + my_list[i], my_list[i+1] = my_list[i+1], my_list[i] + i += 2 +print(f'Новы список: {my_list}') diff --git a/lesson_2/task_2_3.py b/lesson_2/task_2_3.py new file mode 100644 index 0000000..e6fda14 --- /dev/null +++ b/lesson_2/task_2_3.py @@ -0,0 +1,20 @@ +""" +Задание 3. +Пользователь вводит месяц в виде целого числа от 1 до 12. +Сообщить, к какому времени года относится месяц +(зима, весна, лето, осень). Напишите решения через list и dict. +""" + +month_list = ['Зима', 'Зима', 'Весна', 'Весна', 'Весна', 'Лето', + 'Лето', 'Лето', 'Осень', 'Осень', 'Осень', 'Зима'] +month_dict = { + 'Зима': (1, 2, 12), + 'Весна': (3, 4, 5), + 'Лето': (6, 7, 8), + 'Осень': (9, 10, 11) +} +month_n = int(input('Введите номер месяца от 1 до 12: ')) +print(f'Время года в списке: {month_list[month_n - 1]}') +for month in month_dict.keys(): + if month_n in month_dict[month]: + print(f'Время года в словаре: {month}') diff --git a/lesson_2/task_2_4.py b/lesson_2/task_2_4.py new file mode 100644 index 0000000..6623c04 --- /dev/null +++ b/lesson_2/task_2_4.py @@ -0,0 +1,13 @@ +""" +Задание 4. +Пользователь вводит строку из нескольких слов, разделённых пробелами. +Вывести каждое слово с новой строки. Строки нужно пронумеровать. +Если слово длинное, выводить только первые 10 букв в слове. +""" + + +list_words = [str(i) for i in input('Введите слова пробел: ').split()] +i = 1 +for word in list_words: + print(f'{i}: {word[0:10]}') + i += 1 diff --git a/lesson_2/task_2_5.py b/lesson_2/task_2_5.py new file mode 100644 index 0000000..af8e556 --- /dev/null +++ b/lesson_2/task_2_5.py @@ -0,0 +1,14 @@ +""" +Задание 5. +Реализовать структуру «Рейтинг», представляющую собой набор +натуральных чисел, который не возрастает. +У пользователя нужно запрашивать новый элемент рейтинга. +Если в рейтинге существуют элементы с одинаковыми значениями, то +новый элемент с тем же значением должен разместиться после них. +""" + + +my_list = [8, 4, 2, 3, 1] +num = int(input("Введите число: ")) +my_list.append(num) +print(sorted(my_list, reverse=True)) diff --git a/lesson_2/task_2_6.py b/lesson_2/task_2_6.py new file mode 100644 index 0000000..1ec0b07 --- /dev/null +++ b/lesson_2/task_2_6.py @@ -0,0 +1,40 @@ +""" +Задание 6. +* Реализовать структуру данных «Товары». Она должна представлять собой +список кортежей. Каждый кортеж хранит информацию об отдельном товаре. +В кортеже должно быть два элемента — номер товара и словарь с параметрами, +то есть характеристиками товара: название, цена, количество, единица измерения +Структуру нужно сформировать программно, запросив все данные у пользователя. +Пример готовой структуры: +""" + + +item_name = input('Введите название товара: ') +i = 1 +items = [] +while item_name != '': + item_price = float(input('Введите стоимость товара: ')) + item_count = int(input('Введите кол-во товара: ')) + item_unit = input('Введите единицу измерения товара: ') + items.append((i, { + 'название': item_name, + 'цена': item_price, + 'количество': item_count, + 'ед': item_unit + })) + i += 1 + item_name = input('Введите название товара (закончить Enter): ') +analytics = { + 'название': set(), + 'цена': set(), + 'количество': set(), + 'ед': set() +} +for item in items: + print(item) + analytics['название'].add(item[1].get('название')) + analytics['цена'].add(item[1].get('цена')) + analytics['количество'].add(item[1].get('количество')) + analytics['ед'].add(item[1].get('ед')) +for item in analytics: + print('Аналитика', item, ':', list(analytics[item])) diff --git a/lesson_3/task_3_1.py b/lesson_3/task_3_1.py new file mode 100644 index 0000000..1852559 --- /dev/null +++ b/lesson_3/task_3_1.py @@ -0,0 +1,23 @@ +""" +Задание 1. +Реализовать функцию, принимающую два числа (позиционные аргументы) +и выполняющую их деление. Числа запрашивать у пользователя, +предусмотреть обработку ситуации деления на ноль. +""" + + +my_a = float(input('Введите число a: ')) +my_b = float(input('Введите число b: ')) + + +def my_func(a, b): + try: + c = a / b + return f'{c:.02f}' + except ZeroDivisionError: + return f'{a}/{b}=infinite' + except ValueError: + return 'Неверные значения' + + +print(my_func(my_a, my_b)) diff --git a/lesson_3/task_3_2.py b/lesson_3/task_3_2.py new file mode 100644 index 0000000..b48256c --- /dev/null +++ b/lesson_3/task_3_2.py @@ -0,0 +1,21 @@ +""" +Задание 2. +Выполнить функцию, которая принимает несколько параметров, описывающих данные +пользователя: имя, фамилия, год рождения, город проживания, email, телефон. +Функция должна принимать параметры как именованные аргументы. Осуществить +вывод данных о пользователе одной строкой. +""" + + +def user_info(**kwargs) -> object: + return ' '.join(kwargs.values()) + + +print(user_info( + first_name=input('Имя: '), + last_name=input('Фамилия: '), + bdate=input('Год рождения: '), + city=input('Город проживания: '), + email=input('Почта: '), + mobile=input("Телефон: ") +)) diff --git a/lesson_3/task_3_3.py b/lesson_3/task_3_3.py new file mode 100644 index 0000000..e098877 --- /dev/null +++ b/lesson_3/task_3_3.py @@ -0,0 +1,15 @@ +""" +Задание 3. +Реализовать функцию my_func(), которая принимает три позиционных аргумента +и возвращает сумму наибольших двух аргументов. +""" + + +def my_func(): + a = float(input('Введите число a: ')) + b = float(input('Введите число b: ')) + c = float(input('Введите число c: ')) + return a + b + c - min(a, b, c) + + +print('Сумма двух максимальных чисел = ', my_func()) diff --git a/lesson_3/task_3_4.py b/lesson_3/task_3_4.py new file mode 100644 index 0000000..7ec0603 --- /dev/null +++ b/lesson_3/task_3_4.py @@ -0,0 +1,20 @@ +""" +Задание 4. +Программа принимает действительное положительное число x и целое отрицательное +число y. Выполните возведение числа x в степень y. Задание реализуйте в виде +функции my_func(x, y). При решении задания нужно обойтись без встроенной +функции возведения числа в степень. +""" + + +def sqrt(x, y): + power = x + for i in range(1, y * -1): + power = power * x + result = 1 / power + return print(f'{x} в степени {y} будет: {result:.2f}') + + +x = 10 +y = -2 +sqrt(x, y) diff --git a/lesson_3/task_3_5.py b/lesson_3/task_3_5.py new file mode 100644 index 0000000..43fa548 --- /dev/null +++ b/lesson_3/task_3_5.py @@ -0,0 +1,33 @@ +""" +Задание 5. +Программа запрашивает у пользователя строку чисел, разделённых пробелом. +При нажатии Enter должна выводиться сумма чисел. Пользователь может +продолжить ввод чисел, разделённых пробелом и снова нажать Enter. +Сумма вновь введённых чисел будет добавляться к уже подсчитанной сумме. +Но если вместо числа вводится специальный символ, выполнение программы +завершается. Если специальный символ введён после нескольких чисел, то +вначале нужно добавить сумму этих чисел к полученной ранее сумме и после +этого завершить программу. +""" + + +summary = 0 +is_ok = True + + +def my_sum(string_nums, start_sum): + """ + Суммирует все числа в строке + и прибавляет к ранее вычисленному результату. + """ + for num in string_nums.split(' '): + try: + start_sum += float(num) + except Exception: + return start_sum, False + return start_sum, True + + +while is_ok: + summary, is_ok = my_sum(input('Введите числа через пробел: '), summary) + print(summary) diff --git a/lesson_3/task_3_6-7.py b/lesson_3/task_3_6-7.py new file mode 100644 index 0000000..775d30f --- /dev/null +++ b/lesson_3/task_3_6-7.py @@ -0,0 +1,13 @@ +""" +Задание 6. +Реализовать функцию int_func(), принимающую слова из маленьких латинских +букв и возвращающую их же, но с прописной первой буквой. +Например, print(int_func(‘text’)) -> Text. +""" + + +def int_func(*args): + return ' '.join([word.title() for word in args]) + + +print(int_func('car', 'world', 'sun')) diff --git a/lesson_4/task_4_1.py b/lesson_4/task_4_1.py new file mode 100644 index 0000000..1ee994e --- /dev/null +++ b/lesson_4/task_4_1.py @@ -0,0 +1,25 @@ +""" +Задание 1. +Реализовать скрипт, в котором должна быть предусмотрена +функция расчёта заработной платы сотрудника. +Используйте в нём формулу: (выработка в часах*ставка +в час) + премия. Во время выполнения расчёта для +конкретных значений необходимо запускать скрипт с параметрами. +""" + + +import sys + +if len(sys.argv) > 1: + hours, salary_per_our, bonus = map(float, sys.argv[1:]) +else: + hours = int(input('Введите кол-во отработанных часов: ')) + salary_per_our = int(input('Введите ставку: ')) + bonus = int(input('Введите премию: ')) + + +def count_salaru(hours, salary_per_our, bonus): + return f'Зарплата: {hours * salary_per_our + bonus}' + + +print(count_salaru(hours, salary_per_our, bonus)) diff --git a/lesson_4/task_4_2.py b/lesson_4/task_4_2.py new file mode 100644 index 0000000..cba9460 --- /dev/null +++ b/lesson_4/task_4_2.py @@ -0,0 +1,29 @@ +""" +Задание 2. +Представлен список чисел. +Необходимо вывести элементы исходного списка, +значения которых больше предыдущего элемента. +Подсказка: элементы, удовлетворяющие условию, +оформить в виде списка. +Для его формирования используйте генератор. +Пример исходного списка: + [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]. +Результат: + [12, 44, 4, 10, 78, 123]. +""" + +from random import randint + + +def list_generator(range_begin, range_end, cnt_of_elements): + return [randint(range_begin, range_end) for _ in range(cnt_of_elements)] + + +def my_list(lst): + return [lst[i] for i in range(1, len(lst)) if lst[i] > lst[i - 1]] + + +if __name__ == '__main__': + source_list = list_generator(1, 100, 15) + print(f'Исходный список: {source_list}') + print(f'Итоговоый список: {my_list(source_list)}') diff --git a/lesson_4/task_4_3.py b/lesson_4/task_4_3.py new file mode 100644 index 0000000..06dcbf0 --- /dev/null +++ b/lesson_4/task_4_3.py @@ -0,0 +1,9 @@ +""" +Задание 3. +Для чисел в пределах от 20 до 240 +найти числа, кратные 20 или 21. +Решите задание в одну строку. +Подсказка: используйте функцию range() и генератор. +""" + +print([n for n in range(20, 241) if n % 20 == 0 or n % 21 == 0]) diff --git a/lesson_4/task_4_4.py b/lesson_4/task_4_4.py new file mode 100644 index 0000000..7f6b011 --- /dev/null +++ b/lesson_4/task_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] +""" + + +src_list = [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11] +print([n for n in src_list if src_list.count(n) == 1]) diff --git a/lesson_4/task_4_5.py b/lesson_4/task_4_5.py new file mode 100644 index 0000000..2c24da3 --- /dev/null +++ b/lesson_4/task_4_5.py @@ -0,0 +1,17 @@ +""" +Задание 5. +Реализовать формирование списка, +используя функцию range() и возможности генератора. +В список должны войти чётные числа от 100 до 1000 (включая границы). +Нужно получить результат вычисления +произведения всех элементов списка. +Подсказка: использовать функцию reduce(). +""" + + +from functools import reduce + + +print( + reduce((lambda x, y: x * y), [i for i in range(100, 1001) if not i % 2]) +) diff --git a/lesson_4/task_4_6.py b/lesson_4/task_4_6.py new file mode 100644 index 0000000..3712f2b --- /dev/null +++ b/lesson_4/task_4_6.py @@ -0,0 +1,33 @@ +""" +Задание 6. +Реализовать два небольших скрипта: +итератор, генерирующий целые числа, +начиная с указанного; +итератор, повторяющий элементы некоторого +списка, определённого заранее. +Подсказка: используйте функцию count() и cycle() +модуля itertools. +Обратите внимание, что создаваемый цикл +не должен быть бесконечным. +Предусмотрите условие его завершения. +#### Например, в первом задании выводим целые числа, +начиная с 3. При достижении числа 10 — завершаем цикл. +Вторым пунктом необходимо предусмотреть условие, +при котором повторение элементов списка прекратится. +""" + + +from itertools import count, cycle + + +iterator = count(int(input('Введите первый элемент списка: '))) +print('Первые десять чисел начиная с введенного вами числа:') +for i in range(10): + print(next(iterator), end=' ') + +print('\nСтрока цикла') +lst = [2, 3, 6, 5, 4, 2, 8, 7, 4, 2, 7, 3, 4, 8, 2] +iterator = cycle(lst) + +for i in range(len(lst) * 2): + print(next(iterator), end=' ') diff --git a/lesson_4/task_4_7.py b/lesson_4/task_4_7.py new file mode 100644 index 0000000..ed3c8f3 --- /dev/null +++ b/lesson_4/task_4_7.py @@ -0,0 +1,25 @@ +""" +Задание 7. +Реализовать генератор с помощью функции с ключевым +словом yield, создающим очередное значение. +При вызове функции должен создаваться объект-генератор. +Функция вызывается следующим образом: for el in fact(n). +Она отвечает за получение факториала числа. +В цикле нужно выводить только первые n чисел, +начиная с 1! и до n!. +Подсказка: факториал числа n — произведение чисел +от 1 до n. Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24. +""" + + +from math import factorial + + +def fact(num): + for n in range(1, num + 1): + yield n, factorial(n) + + +num = int(input('Ведите число для вычисления его факториала: ')) +for s, f in fact(num): + print(f'{s}! = {f}') diff --git a/lesson_5/task_5_1.py b/lesson_5/task_5_1.py new file mode 100644 index 0000000..1e21da9 --- /dev/null +++ b/lesson_5/task_5_1.py @@ -0,0 +1,18 @@ +""" +Задание 1. +Создать программный файл в текстовом формате, записать +в него построчно данные, вводимые пользователем. +Об окончании ввода данных будет свидетельствовать пустая строка. +""" + + +result = [] +while True: + line = input("Введите строку, или Enter для выхода: ") + if line == '': + exit() + else: + newline = line + '\n' + result.append(newline) + with open("test.txt", "w") as my_fail: + my_fail.writelines(result) diff --git a/lesson_5/task_5_2.py b/lesson_5/task_5_2.py new file mode 100644 index 0000000..49f5e07 --- /dev/null +++ b/lesson_5/task_5_2.py @@ -0,0 +1,20 @@ +""" +Задание 2. +Создать текстовый файл (не программно), сохранить +в нём несколько строк, выполнить подсчёт строк и словв каждой строке. +""" + + +def count_words(string): + return len(string.split()) + + +def count_lines(file): + file.seek(0, 0) + return len(file.readlines()) + + +with open('task_5_2.txt', 'r') as f: + for i, line in enumerate(f.readlines(), 1): + print(f'Слов в {i} строке: {count_words(line)}') + print(f'Количество строк: {count_lines(f)}') diff --git a/lesson_5/task_5_2.txt b/lesson_5/task_5_2.txt new file mode 100644 index 0000000..6de7600 --- /dev/null +++ b/lesson_5/task_5_2.txt @@ -0,0 +1,4 @@ +луна +корова лужайка +солнце +холодильник светильник планета diff --git a/lesson_5/task_5_3.py b/lesson_5/task_5_3.py new file mode 100644 index 0000000..670c444 --- /dev/null +++ b/lesson_5/task_5_3.py @@ -0,0 +1,39 @@ +""" +Задание 3. +Создать текстовый файл (не программно). Построчно записать +фамилии сотрудников и величину их окладов (не менее 10 строк). +Определить, кто из сотрудников имеет оклад менее 20 тысяч, вывести фамилии этих +сотрудников. Выполнить подсчёт средней величины дохода сотрудников. +Пример файла: + +Иванов 23543.12 +Петров 13749.32 +""" + + +file_name = 'task_5_3.txt' +workers = dict() +try: + with open(file_name) as f: + while True: + line = f.readline().split() + if not line: + break + try: + workers[line[0]] = float(line[1]) + if workers[line[0]] <= 0: + raise ValueError + except ValueError: + pass + except IndexError: + pass +except IOError: + print('Ошибка ввод-вывода') + +print('Сотрудники у котрых зарплата меньше 20000:') +print( + ', '.join([worker for worker, salary in workers.items() if salary < 20000]) +) +print( + f'Средний доход сотрудников: {sum(workers.values()) / len(workers): .2f}' +) diff --git a/lesson_5/task_5_3.txt b/lesson_5/task_5_3.txt new file mode 100644 index 0000000..f9f5d56 --- /dev/null +++ b/lesson_5/task_5_3.txt @@ -0,0 +1,6 @@ +Иван 200 +Петр 300 +Олег 400 +Дмитрий 500 +Валерий 600 + diff --git a/lesson_5/task_5_4.py b/lesson_5/task_5_4.py new file mode 100644 index 0000000..4456f8c --- /dev/null +++ b/lesson_5/task_5_4.py @@ -0,0 +1,37 @@ +""" +Задание 4. +Создать (не программно) текстовый файл со следующим содержимым: +One — 1 +Two — 2 +Three — 3 +Four — 4 +Напишите программу, открывающую файл на чтение и считывающую построчно данные. +При этом английские числительные должны заменяться на русские. +Новый блок строк должен записываться в новый текстовый файл. +""" + + +file_in = 'task_5_4_in.txt' +file_out = 'task_5_4_out.txt' +lines = [] +figures = { + 'one': 'один', 'two': 'два', 'three': 'три', + 'four': 'четыре', 'five': 'пять', 'six': 'шесть', + 'seven': 'семь', 'eight': 'восемь', + 'nine': 'девять', 'zero': 'ноль' +} +try: + with open(file_in) as f: + lines = f.readlines() +except IOError as e: + print(e) + print('Ошибка ввод-вывода') + +try: + with open(file_out, 'w') as f: + for line in lines: + word, delimetr, digit = line.split() + f.write(f"{figures[word.lower()]} {delimetr} {digit}\n") +except IOError as e: + print(e) + print('Ошибка ввод-вывода') diff --git a/lesson_5/task_5_4_in.txt b/lesson_5/task_5_4_in.txt new file mode 100644 index 0000000..a13d26b --- /dev/null +++ b/lesson_5/task_5_4_in.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Three — 3 +Four — 4 diff --git a/lesson_5/task_5_4_out.txt b/lesson_5/task_5_4_out.txt new file mode 100644 index 0000000..ad1476d --- /dev/null +++ b/lesson_5/task_5_4_out.txt @@ -0,0 +1,4 @@ +один — 1 +два — 2 +три — 3 +четыре — 4 diff --git a/lesson_5/task_5_5.py b/lesson_5/task_5_5.py new file mode 100644 index 0000000..e68bffe --- /dev/null +++ b/lesson_5/task_5_5.py @@ -0,0 +1,16 @@ +""" +Задание 5. +Создать (программно) текстовый файл, записать в него программно +набор чисел, разделённых пробелами. Программа должна подсчитывать +сумму чисел в файле и выводить её на экран. +""" + + +with open("task_5_5.txt", "w+") as f: + try: + user_enter = input('Введите числа через пробел: ') + f.writelines(user_enter) + answer = user_enter.split() + except ValueError: + print('Ошибка ввода данных') + print(sum(map(int, answer))) diff --git a/lesson_5/task_5_5.txt b/lesson_5/task_5_5.txt new file mode 100644 index 0000000..82561ae --- /dev/null +++ b/lesson_5/task_5_5.txt @@ -0,0 +1 @@ +4 5 6 3 5 \ No newline at end of file diff --git a/lesson_5/task_5_6.py b/lesson_5/task_5_6.py new file mode 100644 index 0000000..b238f29 --- /dev/null +++ b/lesson_5/task_5_6.py @@ -0,0 +1,26 @@ +""" +Задание 6. Сформировать (не программно) текстовый файл. В нём каждая +строка должна описывать учебный предмет и наличие лекционных, практических +и лабораторных занятий по предмету. Сюда должно входить и количество +занятий. Необязательно, чтобы для каждого предмета были все типы занятий. +Сформировать словарь, содержащий название предмета и общее количество +занятий по нему. Вывести его на экран. +Примеры строк файла: Информатика: 100(л) 50(пр) 20(лаб). +Физика: 30(л) — 10(лаб) +Физкультура: — 30(пр) — +Пример словаря: {“Информатика”: 170, “Физика”: 40, “Физкультура”: 30} +""" + + +my_dict = {} +with open('task_5_6.txt') as f: + for subject in f: + subject_name = subject.split()[0] + hours = subject.split()[1:] + my_dict[subject_name] = 0 + for i in hours: + try: + my_dict[subject_name] += int(i[:i.find("(")]) + except ValueError: + pass +print(my_dict) diff --git a/lesson_5/task_5_6.txt b/lesson_5/task_5_6.txt new file mode 100644 index 0000000..9bdf287 --- /dev/null +++ b/lesson_5/task_5_6.txt @@ -0,0 +1,3 @@ +Информатика: 100(л) 50(пр) 20(лаб). +Физика: 30(л) — 10(лаб) +Физкультура: — 30(пр) — diff --git a/lesson_5/task_5_7.json b/lesson_5/task_5_7.json new file mode 100644 index 0000000..e69de29 diff --git a/lesson_5/task_5_7.py b/lesson_5/task_5_7.py new file mode 100644 index 0000000..47fbd70 --- /dev/null +++ b/lesson_5/task_5_7.py @@ -0,0 +1,42 @@ +""" +Задание 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 +import codecs + +with codecs.open('task_5_7.json', 'w') as jf: + with open('task_5_7.txt') as f: + subjects = {} + middle = {} + k, o = 0, 0 + line = f.read().split("\n") + for i in line: + i = i.split() + profit = int(i[2]) - int(i[3]) + subjects[i[0]] = profit + if profit > 0: + k += profit + o += 1 + middle["average_profit"] = k / o + all_list = [subjects, middle] + json.dump(all_list, jf, ensure_ascii=False, indent=4) diff --git a/lesson_5/task_5_7.txt b/lesson_5/task_5_7.txt new file mode 100644 index 0000000..0c163be --- /dev/null +++ b/lesson_5/task_5_7.txt @@ -0,0 +1,6 @@ +firm_1 ООО 10000 5000 +firm_2 ООО 20000 11000 +firm_3 ООО 30000 22000 +firm_4 ООО 40000 33000 +firm_5 ООО 50000 44000 +firm_6 ООО 60000 66000 diff --git a/lesson_6/task_6_1.py b/lesson_6/task_6_1.py new file mode 100644 index 0000000..aa18c2a --- /dev/null +++ b/lesson_6/task_6_1.py @@ -0,0 +1,35 @@ +""" +Задание 1. +Создать класс TrafficLight (светофор). +определить у него один атрибут color (цвет) +и метод running (запуск); +атрибут реализовать как приватный; +в рамках метода реализовать переключение светофора +в режимы: красный, жёлтый, зелёный; +продолжительность первого состояния (красный) составляет 7 секунд, +второго (жёлтый) — 2 секунды, третьего (зелёный) — на ваше усмотрение; +переключение между режимами должно осуществляться только +в указанном порядке (красный, жёлтый, зелёный); +проверить работу примера, создав экземпляр и вызвав описанный метод. +Задачу можно усложнить, реализовав проверку порядка режимов. +При его нарушении выводить соответствующее сообщение и завершать скрипт. +""" + + +from time import sleep +from itertools import cycle + + +class TrafficLight: + + def __init__(self): + self.__color = (('Red', 5), ('Yellow', 2), ('Green', 4)) + + def running(self): + for color, sec in cycle(self.__color): + print(color, '(wait {} sec)'.format(sec)) + sleep(sec) + + +traffic_light = TrafficLight() +traffic_light.running() diff --git a/lesson_6/task_6_2.py b/lesson_6/task_6_2.py new file mode 100644 index 0000000..2322abf --- /dev/null +++ b/lesson_6/task_6_2.py @@ -0,0 +1,32 @@ +""" +Задание 2. +Реализовать класс Road (дорога). +определить атрибуты: length (длина), width (ширина); +значения атрибутов должны передаваться при создании экземпляра класса; +атрибуты сделать защищёнными; +определить метод расчёта массы асфальта, +необходимого для покрытия всей дороги; +использовать формулу: длина*ширина*масса асфальта для +покрытия одного кв. метра дороги асфальтом, +толщиной в 1 см*число см толщины полотна; +проверить работу метода. +Например: 20 м*5000 м*25 кг*5 см = 12500 т. +""" + + +class Road: + def __init__(self, _length, _width, weight, height): + self._length = _length + self._width = _width + self.weight = weight + self.height = height + + def count_mass(self): + road_mass = ( + self._length * self._width * self.weight * self.height / 1000 + ) + print(f'Масса асфальта: 20м * 5000м * 25кг * 5см = {road_mass} т.') + + +build_road = Road(20, 5000, 25, 5) +build_road.count_mass() diff --git a/lesson_6/task_6_3.py b/lesson_6/task_6_3.py new file mode 100644 index 0000000..53fc2a4 --- /dev/null +++ b/lesson_6/task_6_3.py @@ -0,0 +1,40 @@ +""" +Задание 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, wage, bonus): + self.name = name + self.surname = surname + self.position = position + self._income = {"wage": wage, "bonus": bonus} + + +class Position(Worker): + def __init__(self, name, surname, position, wage, bonus): + super().__init__(name, surname, position, wage, bonus) + + def get_full_name(self): + return f"{self.name} {self.surname}" + + def get_total_income(self): + return f"{sum(self._income.values())}" + + +manager = Position("Ivan", "Ivanov", "senior", 150000, 50000) +print(manager.get_full_name()) +print(manager.position) +print(f"Доход с учетом премии: {manager.get_total_income()} руб") diff --git a/lesson_6/task_6_4.py b/lesson_6/task_6_4.py new file mode 100644 index 0000000..9877897 --- /dev/null +++ b/lesson_6/task_6_4.py @@ -0,0 +1,91 @@ +""" +Задание 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: + _registry = [] + + def __init__(self, speed=None, color=None, name=None, is_police=False): + self._registry.append(self) + self.speed = speed + self.color = color + self.name = name + self.is_police = bool(is_police) + + def go(self): + return self.name + ' - машина поехала' + + def stop(self): + return self.name + ' - машина остановилась' + + def turn(self, direction): + return self.name + ' повернула ' + direction + + def get_show_speed(self, max_speed=None): + speed_message = f'{self.name}\nТекущая скорость: {self.speed}' + return speed_message + + +class TownCar(Car): + + def get_show_speed(self, max_speed=40): + message_error = '' + if max_speed: + if self.speed > max_speed: + message_error = f''' + Превышение скорости на {self.speed - max_speed}! + Максимальная скорость: {max_speed} + ''' + + return super().get_show_speed() + message_error + + +class SportCar(Car): + pass + + +class WorkCar(Car): + + def get_show_speed(self, max_speed=60): + message_error = '' + if max_speed: + if self.speed > max_speed: + message_error = f''' + Превышение скорости на {self.speed - max_speed}! + Максимальная скорость: {max_speed} + ''' + super().get_show_speed() + return super().get_show_speed() + message_error + + +class PoliceCar(Car): + pass + + +town_car = TownCar(140, 'Серая', 'Городская машина') +sport_car = SportCar(240, 'Красная', 'Спортивная машина') +work_car = WorkCar(60, 'Желтая', 'Рабочая машина') +police_car = PoliceCar(210, 'Синяя', 'Полицейская машина', True) + +for car in Car._registry: + print('Название: {}, цвет: {}, текущая скорость: {}, полицейская: {}' + .format(car.name, car.color, car.speed, car.is_police)) +print(work_car.get_show_speed()) +print(sport_car.stop()) +print(town_car.go()) +print(police_car.turn('налево')) diff --git a/lesson_6/task_6_5.py b/lesson_6/task_6_5.py new file mode 100644 index 0000000..be6a05e --- /dev/null +++ b/lesson_6/task_6_5.py @@ -0,0 +1,52 @@ +""" +Задание 5. +Реализовать класс Stationery (канцелярская принадлежность). +определить в нём атрибут title (название) и метод draw (отрисовка). +Метод выводит сообщение +«Запуск отрисовки»; +создать три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер); +в каждом классе реализовать переопределение метода draw. +Для каждого класса метод должен выводить уникальное сообщение; +создать экземпляры классов и проверить, что +выведет описанный метод для каждого экземпляра. +""" + + +class Stationery: + def __init__(self, title): + self.title = title + + def draw(self): + print(f"Запуск отрисовки {self.title}") + + +class Pen(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + return f"Для записей используют {self.title}" + + +class Pencil(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + return f"Для пометок используют {self.title}" + + +class Handle(Stationery): + def __init__(self, title): + super().__init__(title) + + def draw(self): + return f"Для маркировки используют {self.title}" + + +pen = Pen("Ручку") +pencil = Pencil("Карандаш") +handle = Handle("Маркер") +print(pen.draw()) +print(pencil.draw()) +print(handle.draw()) diff --git a/lesson_7/task_7_1.py b/lesson_7/task_7_1.py new file mode 100644 index 0000000..4c4c2b1 --- /dev/null +++ b/lesson_7/task_7_1.py @@ -0,0 +1,52 @@ +""" +Задание 1. +Реализовать класс Matrix (матрица). Обеспечить перегрузку +конструктора класса (метод __init__()), который должен +принимать данные (список списков) для формирования матрицы. +Подсказка: матрица — система некоторых математических величин, +расположенных в виде прямоугольной схемы. +Примеры матриц: 3 на 2, 3 на 3, 2 на 4. + +31 32 3 5 32 3 5 8 3 +37 43 2 4 6 8 3 7 1 +51 86 -1 64 -8 +Следующий шаг — реализовать перегрузку метода __str__() +для вывода матрицы в привычном виде. +Далее реализовать перегрузку метода __add__() для +реализации операции сложения двух объектов класса Matrix +(двух матриц). Результатом сложения должна быть новая матрица. +Подсказка: сложение элементов матриц выполнять +поэлементно — первый элемент первой строки первой матрицы +складываем с первым элементом первой строки второй матрицы и т.д. +""" + + +from typing import List + + +class Matrix: + def __init__(self, matrix_data: List[List]): + self.__matrix = matrix_data + + m_rows = len(self.__matrix) + self.__matrix_size = frozenset( + [(m_rows, len(row)) for row in self.__matrix] + ) + + def __add__(self, other: "Matrix") -> "Matrix": + result = [] + + for item in zip(self.__matrix, other.__matrix): + result.append([sum([j, k]) for j, k in zip(*item)]) + + return Matrix(result) + + def __str__(self) -> str: + return '\n'.join(['\t'.join(map(str, row)) for row in self.__matrix]) + + +matrix1 = Matrix([[1, 2], [3, 4], [5, 6], [7, 8]]) +matrix2 = Matrix([[2, 3], [4, 5], [6, 7], [10, 20]]) +print(matrix1, '\n') +print(matrix2, '\n') +print(matrix1 + matrix2) diff --git a/lesson_7/task_7_2.py b/lesson_7/task_7_2.py new file mode 100644 index 0000000..b5f07bf --- /dev/null +++ b/lesson_7/task_7_2.py @@ -0,0 +1,69 @@ +""" +Задание2. +Реализовать проект расчёта суммарного расхода ткани на производство +одежды. Основная сущность (класс) этого проекта — одежда, которая +может иметь определённое название. К типам одежды в этом проекте +относятся пальто и костюм. У этих типов одежды существуют параметры: +размер (для пальто) и рост (для костюма). Это могут +быть обычные числа: V и H, соответственно. +Для определения расхода ткани по каждому типу одежды использовать +формулы: для пальто (V/6.5 + 0.5), для костюма (2*H + 0.3). +Проверить работу этих методов на реальных данных. +Реализовать общий подсчет расхода ткани. Проверить на практике +полученные на этом уроке знания: реализовать абстрактные классы +для основных классов проекта, проверить +на практике работу декоратора @property. +""" + + +from abc import ABC, abstractmethod + + +class Clothing(ABC): + @abstractmethod + def textile_calc(self): + pass + + @property + @abstractmethod + def name(self): + pass + + +class Coat(Clothing): + def __init__(self, size: float, name): + if not isinstance(size, float): + print('задайте размер числом') + raise ValueError + self.__size = size + self.__name = name + + def textile_calc(self): + return self.__size / 6.5 + 0.5 + + @property + def name(self): + return f'Пальто {self.__name}' + + +class Suit(Clothing): + def __init__(self, height: float, name): + if not isinstance(height, float): + print('задайте размер числом') + raise ValueError + self.__height = height + self.__name = name + + def textile_calc(self): + return self.__height * 2 + 0.3 + + @property + def name(self): + return f'{self.__name}' + + +suit01 = Suit(175.2, 'Пальто') +coat01 = Coat(50.0, 'Костюм') + +print(suit01.name) +print(f'Для пошива {suit01.name} потребуется {coat01.textile_calc()}') diff --git a/lesson_7/task_7_3.py b/lesson_7/task_7_3.py new file mode 100644 index 0000000..8dfd8a2 --- /dev/null +++ b/lesson_7/task_7_3.py @@ -0,0 +1,76 @@ +""" +Задание 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, num): + self.num = num + + def __str__(self): + return self.num + + def __add__(self, other): + return f"Сумма {self.num} + {other.num} = {self.num + other.num}" + + def __sub__(self, other): + return self.num - other.num if self.num - other.num > 0 \ + else "Ячеек в первой клетке меньше или равно второй" + + def __mul__(self, other): + return f"Умножение {self.num} * {other.num} = {self.num * other.num}" + + def __truediv__(self, other): + if other.num != 0: + r = f"Деление {self.num} / {other.num}= {self.num / other.num:.3f}" + return r + else: + return "Делить на ноль нельзя" + + def make_order(self, rows): + result = "\n".join(["*" * rows for i in range(self.num // rows)]) \ + + "\n" \ + + "*" * (self.num % rows) + return result + + +c_1 = Cell(10) +c_2 = Cell(44) +print(c_1 + c_2) +print(c_1 - c_2) +print(c_1 * c_2) +print(c_1 / c_2) +print(c_2.make_order(10)) diff --git a/lesson_8/task_8_1.py b/lesson_8/task_8_1.py new file mode 100644 index 0000000..6fe49cd --- /dev/null +++ b/lesson_8/task_8_1.py @@ -0,0 +1,55 @@ +""" +Задание 1. +Реализовать класс «Дата», функция-конструктор которого должна +принимать дату в виде строки формата «день-месяц-год». В рамках +класса реализовать два метода. Первый, с +декоратором @classmethod. Он должен извлекать число, +месяц, год и преобразовывать их тип к типу «Число». +Второй, с декоратором @staticmethod, должен проводить +валидацию числа, месяца и года (например, месяц — от 1 до 12). +Проверить работу полученной структуры на реальных данных. +""" + + +class Data: + def __init__(self, day_month_year): + # self.day = day + # self.month = month + # self.year = year + self.day_month_year = str(day_month_year) + + @classmethod + def extract(cls, day_month_year): + my_date = [] + + for i in day_month_year.split(): + if i != '-': + my_date.append(i) + + return int(my_date[0]), int(my_date[1]), int(my_date[2]) + + @staticmethod + def valid(day, month, year): + + if 1 <= day <= 31: + if 1 <= month <= 12: + if 2019 >= year >= 0: + return 'All right' + else: + return 'Неправильный год' + else: + return 'Неправильный месяц' + else: + return 'Неправильный день' + + def __str__(self): + return f'Текущая дата {Data.extract(self.day_month_year)}' + + +today = Data('11 - 1 - 2001') +print(today) +print(Data.valid(11, 11, 2022)) +print(today.valid(11, 13, 2011)) +print(Data.extract('11 - 11 - 2011')) +print(today.extract('11 - 11 - 2020')) +print(Data.valid(1, 11, 2000)) diff --git a/lesson_8/task_8_2.py b/lesson_8/task_8_2.py new file mode 100644 index 0000000..c73a5d5 --- /dev/null +++ b/lesson_8/task_8_2.py @@ -0,0 +1,28 @@ +""" +Задание 2. +Создайте собственный класс-исключение, обрабатывающий +ситуацию деления на ноль. Проверьте его работу на данных, +вводимых пользователем. При вводе нуля в качестве +делителя программа должна корректно обработать эту +ситуацию и не завершиться с ошибкой. +""" + + +class DivisionByNull: + def __init__(self, divider, denominator): + self.divider = divider + self.denominator = denominator + + @staticmethod + def divide_by_null(divider, denominator): + try: + result = divider / denominator + return result + except Exception: + return ("Деление на ноль недопустимо") + + +div = DivisionByNull(10, 100) +print(DivisionByNull.divide_by_null(10, 0)) +print(DivisionByNull.divide_by_null(10, 0.1)) +print(div.divide_by_null(100, 0)) diff --git a/lesson_8/task_8_3.py b/lesson_8/task_8_3.py new file mode 100644 index 0000000..713943e --- /dev/null +++ b/lesson_8/task_8_3.py @@ -0,0 +1,48 @@ +""" +Задание 3. +Создайте собственный класс-исключение, который должен +проверять содержимое списка на наличие только чисел. +Проверить работу исключения на реальном примере. +Запрашивать у пользователя данные и заполнять список +необходимо только числами. Класс-исключение должен +контролировать типы данных элементов списка. +Примечание: длина списка не фиксирована. Элементы +запрашиваются бесконечно, пока пользователь сам не +остановит работу скрипта, введя, например, команду «stop». +При этом скрипт завершается, сформированный список +с числами выводится на экран. +Подсказка: для этого задания примем, что пользователь +может вводить только числа и строки. Во время ввода +пользователем очередного элемента необходимо реализовать +проверку типа элемента. Вносить его в список, только +если введено число. Класс-исключение должен не +позволить пользователю ввести текст (не число) и +отобразить соответствующее сообщение. При этом +работа скрипта не должна завершаться. +""" + + +class Error: + def __init__(self, *args): + self.my_list = [] + + def my_input(self): + while True: + try: + val = int(input('Введите значения и нажимайте Enter - ')) + self.my_list.append(val) + print(f'Текущий список - {self.my_list} \n ') + except Exception: + print("Недопустимое значение - строка и булево") + y_or_n = input('Попробовать еще раз? Y/N ') + + if y_or_n == 'Y' or y_or_n == 'y': + print(try_except.my_input()) + elif y_or_n == 'N' or y_or_n == 'n': + return 'Вы вышли' + else: + return 'Вы вышли' + + +try_except = Error(1) +print(try_except.my_input()) diff --git a/lesson_8/task_8_4-5-6.py b/lesson_8/task_8_4-5-6.py new file mode 100644 index 0000000..83acaa2 --- /dev/null +++ b/lesson_8/task_8_4-5-6.py @@ -0,0 +1,99 @@ +""" +Задание 4. +Начните работу над проектом «Склад оргтехники». +Создайте класс, описывающий склад. А также класс +«Оргтехника», который будет базовым для +классов-наследников. Эти классы — конкретные +типы оргтехники (принтер, сканер, ксерокс). +В базовом классе определите параметры, общие +для приведённых типов. В классах-наследниках +реализуйте параметры, уникальные для каждого типа оргтехники. + +--- +Продолжить работу над первым заданием. Разработайте +методы, которые отвечают за приём оргтехники на +склад и передачу в определённое подразделение компании. +Для хранения данных о наименовании и количестве единиц +оргтехники, а также других данных, можно использовать +любую подходящую структуру (например, словарь). +--- +Продолжить работу над вторым заданием. Реализуйте +механизм валидации вводимых пользователем данных. +Например, для указания количества принтеров, отправленных +на склад, нельзя использовать строковый тип данных. +Подсказка: постарайтесь реализовать в проекте +«Склад оргтехники» максимум возможностей, изученных на уроках по ООП. +""" + + +class StoreMashines: + + def __init__(self, name, price, quantity, number_of_lists, *args): + self.name = name + self.price = price + self.quantity = quantity + self.numb = number_of_lists + self.my_store_full = [] + self.my_store = [] + self.my_unit = { + 'Модель устройства': self.name, + 'Цена за ед': self.price, + 'Количество': self.quantity + } + + def __str__(self): + return f'{self.name} цена {self.price} количество {self.quantity}' + + # @classmethod + # @staticmethod + def reception(self): + # print('Для выхода - Q, продолжение - Enter') + # while True: + try: + unit = input('Введите наименование ') + unit_p = int(input('Введите цену за ед ')) + unit_q = int(input('Введите количество ')) + unique = { + 'Модель устройства': unit, + 'Цена за ед': unit_p, + 'Количество': unit_q + } + self.my_unit.update(unique) + self.my_store.append(self.my_unit) + print(f'Текущий список -\n {self.my_store}') + except Exception: + return 'Ошибка ввода данных' + + print('Для выхода - Q, продолжение - Enter') + q = input('---> ') + if q == 'Q' or q == 'q': + self.my_store_full.append(self.my_store) + print(f'Весь склад -\n {self.my_store_full}') + return 'Выход' + else: + return StoreMashines.reception(self) + + +class Printer(StoreMashines): + def to_print(self): + return f'to print smth {self.numb} times' + + +class Scanner(StoreMashines): + def to_scan(self): + return f'to scan smth {self.numb} times' + + +class Copier(StoreMashines): + def to_copier(self): + return f'to copier smth {self.numb} times' + + +unit_1 = Printer('hp', 2000, 5, 10) +unit_2 = Scanner('Canon', 1200, 5, 10) +unit_3 = Copier('Xerox', 1500, 1, 15) +print(unit_1.reception()) +print(unit_2.reception()) +print(unit_3.reception()) +print(unit_1.to_print()) +print(unit_3.to_copier()) diff --git a/lesson_8/task_8_7.py b/lesson_8/task_8_7.py new file mode 100644 index 0000000..91fa9ae --- /dev/null +++ b/lesson_8/task_8_7.py @@ -0,0 +1,38 @@ +""" +Задание 7. +Реализовать проект «Операции с комплексными числами». +Создайте класс «Комплексное число». Реализуйте перегрузку +методов сложения и умножения комплексных чисел. +Проверьте работу проекта. Для этого создаёте +экземпляры класса (комплексные числа), выполните +сложение и умножение созданных экземпляров. +Проверьте корректность полученного результата. +""" + + +class ComplexNumber: + def __init__(self, a, b, *args): + self.a = a + self.b = b + self.z = 'a + b * i' + + def __add__(self, other): + print('Сумма z1 и z2 равна') + return f'z = {self.a + other.a} + {self.b + other.b} * i' + + def __mul__(self, other): + print('Произведение z1 и z2 равно') + return ( + f'z= {self.a * other.a - (self.b * other.b)} ' + '+ {self.b * other.a} * i' + ) + + def __str__(self): + return f'z = {self.a} + {self.b} * i' + + +z_1 = ComplexNumber(1, -2) +z_2 = ComplexNumber(3, 4) +print(z_1) +print(z_1 + z_2) +print(z_1 * z_2)