diff --git a/task_1.py b/task_1.py new file mode 100644 index 00000000..c890a166 --- /dev/null +++ b/task_1.py @@ -0,0 +1,83 @@ +""" +1. Пользователь вводит данные о количестве предприятий, их наименования и прибыль +за 4 квартала (т.е. 4 отдельных числа) для каждого предприятия. +Программа должна определить среднюю прибыль (за год для всех предприятий) +и вывести наименования предприятий, чья прибыль выше среднего и отдельно +вывести наименования предприятий, чья прибыль ниже среднего. + +Подсказка: +Для решения задачи обязательно примените какую-нибудь коллекцию из модуля collections +Для лучшее освоения материала можете даже сделать несколько решений этого задания, +применив несколько коллекций из модуля collections + +Пример: +Введите количество предприятий для расчета прибыли: 2 +Введите название предприятия: Рога +через пробел введите прибыль данного предприятия +за каждый квартал(Всего 4 квартала): 235 345634 55 235 + +Введите название предприятия: Копыта +через пробел введите прибыль данного предприятия +за каждый квартал(Всего 4 квартала): 345 34 543 34 + +Средняя годовая прибыль всех предприятий: 173557.5 +Предприятия, с прибылью выше среднего значения: Рога + +Предприятия, с прибылью ниже среднего значения: Копыта +""" + + +# Рога 235 345634 55 235 +# Копыта 345 34 543 34 + +# Я использовал OrderedDict, правда не понимаю зачем здесь нужен любой объект из класса collections +from collections import OrderedDict as odict +import numpy as np + +firm_profits = [] +firm_info = [] +num_firms = int(input('Plese provide number of rows: ').rstrip().lstrip()) +i = 0 +while i < num_firms: + dic = odict() + firm_name = str(input('Plese provide the name of firm: ').rstrip().lstrip()) + firm_profits = np.array((input('Plese provide the firm''s quarter profits separeted by spaces: ').rstrip().lstrip()).split(' '), dtype=int) + y_profit = np.sum(firm_profits) # Посчитать суммарный годовой доход + firm_profits = np.append(firm_profits, y_profit) # Добавит суммарный годовой доход в массив 5-ым элементом + dic.update({firm_name : firm_profits}) + firm_info.append(dic) + i += 1 + +def sum_avg(): + profit = 0 + for firm in firm_info: + for item in firm.items(): + profit += item[1][4] + return profit / num_firms + +all_avg = sum_avg() +for firm in firm_info: + for item in firm.items(): + if item[1][4] > all_avg: + print (f'Firm {item[0]} has average profit {item[1][4]} that is more than {all_avg}') + elif item[1][4] == all_avg: + print (f'Firm {item[0]} has average profit {item[1][4]} that is the same as {all_avg}') + else: + print (f'Firm {item[0]} has average profit {item[1][4]} that is less than {all_avg}') + + +""" +Plese provide number of rows: 2 +Plese provide the name of firm: Рога +Plese provide the firms quarter profits separeted by spaces: 235 345634 55 235 +Plese provide the name of firm: Копыта +Plese provide the firms quarter profits separeted by spaces: 345 34 543 34 +Firm Рога has average profit 346159 that is more than 173557.5 +Firm Копыта has average profit 956 that is less than 173557.5 +""" + + + + + + diff --git a/task_2.py b/task_2.py new file mode 100644 index 00000000..e73645d4 --- /dev/null +++ b/task_2.py @@ -0,0 +1,42 @@ +""" +2. Написать программу сложения и умножения двух шестнадцатеричных чисел. +При этом каждое число представляется как массив, элементы которого это цифры числа. +Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно. +Сумма чисел из примера: [‘C’, ‘F’, ‘1’], произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’]. + +Подсказка: +Для решения задачи обязательно примените какую-нибудь коллекцию из модуля collections +Для лучшее освоения материала можете даже сделать несколько решений этого задания, +применив несколько коллекций из модуля collections +Также попробуйте решить задачу вообще без collections и применить только ваши знания по ООП +(в частности по перегрузке методов) +""" + + + +class Hex: + def __init__(self, x): + self.list = list(x) + self.x = str(x) + + def __str__(self): + return str(self.x) + + def __add__(self, obj): + return hex(int(self.x, 16) + int(str(obj), 16))[2:].upper() + + def __sub__(self, obj): + return hex(int(self.x, 16) - int(str(obj), 16))[2:].upper() + + def __mul__(self, obj): + return hex(int(self.x, 16) * int(str(obj), 16))[2:].upper() + + + +hex1 = Hex('A2') +hex2 = Hex('C4F') +print(hex1 + hex2) +print(hex2 - hex1) +print(hex1 * hex2) + +# Я не придумал к чему тут применить collections, а классы - пожалуйста :) \ No newline at end of file diff --git a/task_3.py b/task_3.py new file mode 100644 index 00000000..b6609780 --- /dev/null +++ b/task_3.py @@ -0,0 +1,57 @@ +""" +Задача 3. +В соответствии с документацией Python, +deque – это обобщение стеков и очередей. +Вот основное правило: если вам нужно что-то быстро дописать или вытащить, используйте deque. +Если вам нужен быстрый случайный доступ, используйте list. + +Задача: создайте простой список (list) и очередь (deque). +Выполните различные операции с каждым из объектов. +Сделайте замеры и оцените, насколько информация в документации +соответствует дейстивтельности. +""" +from collections import deque +from random import randint +import timeit + +src = [randint(1, 100) for i in range(1, 10000)] +queue = deque(src) + + +def insert_list(indx, val): + src.insert(indx, val) + +def insert_queue(indx, val): + queue.insert(indx, val) + +indx = 123 +val = 9999 +print(timeit.timeit("insert_list(indx, val)", setup="from __main__ import insert_list, indx, val", number=1000)) +print(timeit.timeit("insert_queue(indx, val)", setup="from __main__ import insert_queue, indx, val", number=1000)) +""" +0.006530399999999999 +0.00037399999999999933 +""" +# Вывод вставка в deque происходит быстрее + +def get_from_list(indx): + return src[indx] + +def get_from_queue(indx): + i = 0 + for val in queue: + if i == indx: + return val + else: + i += 1 + + +indx = 123 +print(timeit.timeit("get_from_list(indx)", setup="from __main__ import get_from_list, indx", number=1000)) +print(timeit.timeit("get_from_queue(indx)", setup="from __main__ import get_from_queue, indx", number=1000)) + +""" +8.289999999999687e-05 +0.005491299999999998 +""" +# поиск по индексу в list значительно быстрее diff --git a/task_4.py b/task_4.py new file mode 100644 index 00000000..e5b40170 --- /dev/null +++ b/task_4.py @@ -0,0 +1,48 @@ +""" +Задача 4. +Поработайте с обычным словарем и OrderedDict. +Выполните различные операции с каждым из объектов и сделайте замеры. +Опишите полученные результаты, сделайте выводы. +""" +from collections import OrderedDict +import timeit + +us_dict = {'z' : 2, 'b' : 8, 'c' : 10, 'd' : 12, 'a' : 45} +or_dict = OrderedDict() +or_dict = {'z' : 2, 'b' : 8, 'c' : 10, 'd' : 12, 'a' : 45} + +def us_dict_update(key, val): + us_dict.update({key : val}) + +def or_dict_update(key, val): + or_dict.update({key : val}) + + +key = 'r' +val = 888 +print(timeit.timeit("us_dict_update(key, val)", setup="from __main__ import us_dict_update, key, val", number=1000)) +print(timeit.timeit("or_dict_update(key, val)", setup="from __main__ import or_dict_update, key, val", number=1000)) +""" +0.00022180000000000116 +0.0002420999999999951 +""" +# Время обновления почти одинаково + + +def us_dict_get(key): + return us_dict.get(key) + +def or_dict_get(key): + return or_dict.get(key) + + +key = 'a' +print(timeit.timeit("us_dict_get(key)", setup="from __main__ import us_dict_get, key", number=1000)) +print(timeit.timeit("or_dict_get(key)", setup="from __main__ import or_dict_get, key", number=1000)) +""" +0.00011160000000000336 +0.00011830000000000174 +""" +# Время выполнения get почти одинаково + +# Я не вижу преимуществ у OrderedDict