diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58_[Default_Changelist]/shelved.patch
new file mode 100644
index 0000000..65d7bc7
--- /dev/null
+++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58_[Default_Changelist]/shelved.patch
@@ -0,0 +1,49 @@
+Index: .idea/workspace.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
+<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n 1618919133612\r\n \r\n \r\n 1618919133612\r\n \r\n \r\n 1619006548469\r\n \r\n \r\n \r\n 1619006548469\r\n \r\n \r\n 1619610802732\r\n \r\n \r\n \r\n 1619610802732\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- .idea/workspace.xml (revision bac6a5dc48b66266dc1475873bf960445c966dcd)
++++ .idea/workspace.xml (date 1620643611520)
+@@ -35,7 +35,7 @@
+
+
+
+
+
+@@ -222,22 +222,22 @@
+
+
+
+-
++
+
+
+-
+-
++
++
+
+
+-
+-
++
++
+
+
+-
+-
++
++
+
+
+-
++
+
+
+
diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58__Default_Changelist_.xml
new file mode 100644
index 0000000..272980b
--- /dev/null
+++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58__Default_Changelist_.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..7eebd3b
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1620734349569
+
+
+ 1620734349569
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/task1.py b/task1.py
new file mode 100644
index 0000000..c6a9074
--- /dev/null
+++ b/task1.py
@@ -0,0 +1,68 @@
+"""
+1. Пользователь вводит данные о количестве предприятий, их наименования и прибыль
+за 4 квартала (т.е. 4 отдельных числа) для каждого предприятия.
+Программа должна определить среднюю прибыль (за год для всех предприятий)
+и вывести наименования предприятий, чья прибыль выше среднего и отдельно
+вывести наименования предприятий, чья прибыль ниже среднего.
+Подсказка:
+Для решения задачи обязательно примените какую-нибудь коллекцию из модуля collections.
+Пример:
+Введите количество предприятий для расчета прибыли: 2
+Введите название предприятия: Фирма_1
+через пробел введите прибыль данного предприятия
+за каждый квартал(Всего 4 квартала): 235 345634 55 235
+Введите название предприятия: Фирма_2
+через пробел введите прибыль данного предприятия
+за каждый квартал(Всего 4 квартала): 345 34 543 34
+Средняя годовая прибыль всех предприятий: 173557.5
+Предприятия, с прибылью выше среднего значения: Фирма_1
+Предприятия, с прибылью ниже среднего значения: Фирма_2
+"""
+
+from collections import namedtuple
+
+
+class Firm:
+
+ def __init__(self):
+ firm_data = namedtuple('Firm_Data', 'name income')
+ self.data = firm_data(name=input('Введите название предприятия: '), income=self.income_input())
+
+ def income_input(self):
+ income = input('через пробел введите прибыль данного предприятия за каждый квартал(Всего 4 квартала): ').split()
+ if len(income) == 4:
+ try:
+ return sum(list(map(int, income)))
+ except ValueError:
+ pass
+ self.income_input()
+
+
+while True:
+ try:
+ firms_number = int(input('Введите количество предприятий для расчета прибыли: '))
+ break
+ except ValueError:
+ continue
+
+firms = []
+average = 0
+
+for i in range(firms_number):
+ firm_i = Firm()
+ firms.append(firm_i)
+ average += firm_i.data.income
+
+average = average / len(firms)
+above_average = []
+below_average = []
+
+for i in firms:
+ if i.data.income > average:
+ above_average.append(i.data.name)
+ else:
+ below_average.append(i.data.name)
+
+print(f'Средняя годовая прибыль всех предприятий: {average}')
+print(f'Предприятия, с прибылью выше среднего значения: {above_average}')
+print(f'Предприятия, с прибылью ниже среднего значения: {below_average}')
diff --git a/task2.py b/task2.py
new file mode 100644
index 0000000..e4e02aa
--- /dev/null
+++ b/task2.py
@@ -0,0 +1,70 @@
+"""
+2. Написать программу сложения и умножения двух шестнадцатиричных чисел.
+При этом каждое число представляется как массив, элементы которого это цифры числа.
+Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно.
+Сумма чисел из примера: [‘C’, ‘F’, ‘1’], произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’].
+Подсказка:
+Для решения задачи обязательно примените какую-нибудь коллекцию из модуля collections
+Для лучшее освоения материала можете даже сделать несколько решений этого задания,
+применив несколько коллекций из модуля collections
+Также попробуйте решить задачу вообще без collections и применить только ваши знания по ООП
+(в частности по перегрузке методов)
+__mul__
+__add__
+Пример:
+Например, пользователь ввёл A2 и C4F.
+Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно.
+Сумма чисел из примера: [‘C’, ‘F’, ‘1’]
+Произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’].
+1. вариант
+defaultdict(list)
+int(, 16)
+reduce
+2. вариант
+class HexNumber:
+ __add__
+ __mul__
+hx = HexNumber
+hx + hx
+hex()
+"""
+
+from collections import defaultdict
+
+hex_dct = defaultdict(list, {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15})
+
+
+def hex_check(lst):
+ answer = []
+ for i in lst:
+ if hex_dct[i] != []:
+ answer.append(i)
+ return answer
+
+
+def hex_number(lst):
+ if len(lst) == 1:
+ return hex_dct[lst[0]]
+ else:
+ return hex_dct[lst[0]] * (16 ** (len(lst) - 1)) + hex_number(lst[1:])
+
+
+def dec_number(num):
+ return hex(num)[2:].upper()
+
+
+def hex_sum(hex1, hex2):
+ return dec_number(hex_number(hex_check(hex1)) + hex_number(hex_check(hex2)))
+
+
+def hex_mult(hex1, hex2):
+ return dec_number(hex_number(hex_check(hex1)) * hex_number(hex_check(hex2)))
+
+
+first = list(input('Введите первое шестнадцатиричное число: '))
+second = list(input('Введите второе шестнадцатиричное число: '))
+print(f'Сумма чисел равна: {list(hex_sum(first, second))}')
+print(f'Произведение чисел равно: {list(hex_mult(first, second))}')
+
+
+
diff --git a/task2_2.py b/task2_2.py
new file mode 100644
index 0000000..55878d7
--- /dev/null
+++ b/task2_2.py
@@ -0,0 +1,28 @@
+class HexNumber:
+
+ def __init__(self, number):
+ self.number = list(str(number))
+
+ def __str__(self):
+ return str(self.number)
+
+ def __add__(self, other):
+ return HexNumber(hex(int(''.join(self.number), 16) + int(''.join(other.number), 16))[2:])
+
+ def __mul__(self, other):
+ return HexNumber(hex(int(''.join(self.number), 16) * int(''.join(other.number), 16))[2:])
+
+
+def hex_input(txt):
+ num = input(txt)
+ try:
+ int(num, 16)
+ return num
+ except ValueError:
+ return hex_input(txt)
+
+
+first = hex_input('Введите первое шестнадцатиричное число: ')
+second = hex_input('Введите второе шестнадцатиричное число: ')
+print(f'Сумма чисел равна: {HexNumber(first) + HexNumber(second)}')
+print(f'Произведение чисел равно: {HexNumber(first) * HexNumber(second)}')
\ No newline at end of file
diff --git a/task3.py b/task3.py
new file mode 100644
index 0000000..8d4cb20
--- /dev/null
+++ b/task3.py
@@ -0,0 +1,100 @@
+"""
+Задача 3.
+В соответствии с документацией Python,
+deque – это обобщение стеков и очередей.
+Вот основное правило: если вам нужно что-то быстро дописать или вытащить, используйте deque.
+Если вам нужен быстрый случайный доступ, используйте list.
+Задача:
+1) создайте простой список (list) и очередь (deque). Сделайте замеры и оцените что заполняется быстрее.
+2) Выполните различные операции с каждым из объектов. Сделайте замеры и оцените, где и какие операции быстрее.
+Не забудьте, что сравнивать, например, можно операцию appendleft дека и insert списка и т.д.
+"""
+
+# Заполнение списка и очереди происходит с одинаковой скорость, получение последнего элемента тоже.
+# Заполнение очереди слева выполняется во много раз быстрее заполнения слева списка.
+# Точно так же как и получение элемента слева и extend слева.
+# Что по сути весьма очевидно, потому что очередь для этого и нужна.
+
+from collections import deque
+from timeit import timeit
+
+
+def lst_fulfill(num):
+ lst = []
+ for i in range(num):
+ lst.append(i)
+ return lst
+
+
+def deq_fulfill(num):
+ deq = deque()
+ for i in range(num):
+ deq.append(i)
+ return deq
+
+
+def lst_fulfill_left(num):
+ lst = []
+ for i in range(num):
+ lst.insert(0, i)
+
+
+def deq_fulfill_left(num):
+ deq = deque()
+ for i in range(num):
+ deq.appendleft(i)
+
+
+def lst_pop(lst):
+ return lst.pop()
+
+
+def deq_pop(deq):
+ return deq.pop()
+
+
+def lst_pop_left(lst):
+ return lst.pop(0)
+
+
+def deq_pop_left(deq):
+ return deq.popleft()
+
+
+def lst_extend_left(lst, lst2):
+ lst = lst2 + lst
+ return lst
+
+
+def deq_extend_left(deq, deq2):
+ deq.extend(deq2)
+ return deq
+
+
+print('Append')
+print(timeit('lst_fulfill(10000)', number=10000, globals=globals()))
+print(timeit('deq_fulfill(10000)', number=10000, globals=globals()))
+
+print('Append left')
+print(timeit('lst_fulfill_left(10000)', number=10000, globals=globals()))
+print(timeit('deq_fulfill_left(10000)', number=10000, globals=globals()))
+
+print('pop')
+lst_a = lst_fulfill(30000)
+deq_a = deq_fulfill(30000)
+print(timeit('lst_pop(lst_a)', number=10000, globals=globals()))
+print(timeit('deq_pop(deq_a)', number=10000, globals=globals()))
+
+print('pop left')
+lst_b = lst_fulfill(30000)
+deq_b = deq_fulfill(30000)
+print(timeit('lst_pop_left(lst_b)', number=10000, globals=globals()))
+print(timeit('deq_pop_left(deq_b)', number=10000, globals=globals()))
+
+print('extend left')
+lst_c = lst_fulfill(30000)
+deq_c = deq_fulfill(30000)
+lst_d = lst_fulfill(100)
+deq_d = deq_fulfill(100)
+print(timeit('lst_extend_left(lst_c, lst_d)', number=1000, globals=globals()))
+print(timeit('deq_extend_left(deq_c, deq_d)', number=1000, globals=globals()))
diff --git a/task4.py b/task4.py
new file mode 100644
index 0000000..a94bdef
--- /dev/null
+++ b/task4.py
@@ -0,0 +1,55 @@
+"""
+Задача 4.
+Поработайте с обычным словарем и OrderedDict.
+Выполните операции с каждым из них (заполнение, получение элемента) и сделайте замеры.
+Опишите полученные результаты, сделайте выводы.
+И есть ли смысл исп-ть OrderedDict в Python 3.6 и более поздних версиях?
+"""
+
+# Операция заполнения словаря выполняется быстрее заполнения OrderedDict, видимо засчёт того, что последний ещё
+# закрепляет последовательность дополнительно. Остальные операции выполняются примерно одинаково.
+# Вывод: исходя из этих операций, OrderedDict не нужен, что логично, потому что его дополнительный, по сравнению
+# с обычным словарём, функционал - больше не дополнительный и по сути устаревший.
+
+from collections import OrderedDict
+from timeit import timeit
+
+
+def dct_fulfill():
+ dct = dict()
+ for i in range(100000):
+ dct[i] = i
+ return dct
+
+
+def ord_fulfill():
+ ord = OrderedDict()
+ for i in range(100000):
+ ord[i] = i
+ return ord
+
+
+def dct_get(dct):
+ return dct[500]
+
+
+def ord_get(ord):
+ return ord[500]
+
+
+def dct_search(dct):
+ return 500 in dct
+
+
+def ord_search(ord):
+ return 500 in ord
+
+
+dct_a = dct_fulfill()
+ord_a = ord_fulfill()
+print(timeit('dct_fulfill()', number=10000, globals=globals()))
+print(timeit('ord_fulfill()', number=10000, globals=globals()))
+print(timeit('dct_get(dct_a)', number=100000000, globals=globals()))
+print(timeit('ord_get(ord_a)', number=100000000, globals=globals()))
+print(timeit('dct_search(dct_a)', number=100000000, globals=globals()))
+print(timeit('ord_search(ord_a)', number=100000000, globals=globals()))
\ No newline at end of file