From 47960d996795f890186a82c629ed2a2646fcf861 Mon Sep 17 00:00:00 2001 From: Barrakuda Date: Sat, 15 May 2021 14:00:37 +0200 Subject: [PATCH 1/2] first commit --- .../shelved.patch | 49 ++++ ..._11_05_2021_13_58__Default_Changelist_.xml | 4 + .idea/vcs.xml | 6 + .idea/workspace.xml | 228 ++++++++++++++++++ task1.py | 68 ++++++ task2.py | 70 ++++++ task2_2.py | 28 +++ task3.py | 62 +++++ task4.py | 55 +++++ 9 files changed, 570 insertions(+) create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58_[Default_Changelist]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_11_05_2021_13_58__Default_Changelist_.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 task1.py create mode 100644 task2.py create mode 100644 task2_2.py create mode 100644 task3.py create mode 100644 task4.py 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..f128c2c --- /dev/null +++ b/task3.py @@ -0,0 +1,62 @@ +""" +Задача 3. +В соответствии с документацией Python, +deque – это обобщение стеков и очередей. +Вот основное правило: если вам нужно что-то быстро дописать или вытащить, используйте deque. +Если вам нужен быстрый случайный доступ, используйте list. +Задача: +1) создайте простой список (list) и очередь (deque). Сделайте замеры и оцените что заполняется быстрее. +2) Выполните различные операции с каждым из объектов. Сделайте замеры и оцените, где и какие операции быстрее. +Не забудьте, что сравнивать, например, можно операцию appendleft дека и insert списка и т.д. +""" + +# Заполнение списка и очереди происходит с одинаковой скорость, получение последнего элемента тоже. +# Заполнение очереди слева выполняется во много раз быстрее заполнения слева списка. +# Что по сути весьма очевидно, потому что очередь для этого и нужна. + +from collections import deque +from timeit import timeit + + +def lst_fulfill(): + lst = [] + for i in range(100000): + lst.append(i) + return lst + + +def deq_fulfill(): + deq = deque() + for i in range(100000): + deq.append(i) + return deq + + +def lst_fulfill_left(): + lst = [] + for i in range(10000): + lst.insert(0, i) + + +def deq_fulfill_left(): + deq = deque() + for i in range(10000): + deq.appendleft(i) + + +def lst_pop(lst): + return lst.pop() + + +def deq_pop(deq): + return deq.pop() + + +lst_a = lst_fulfill() +deq_a = deq_fulfill() +print(timeit('lst_fulfill()', number=10000, globals=globals())) +print(timeit('deq_fulfill()', number=10000, globals=globals())) +print(timeit('lst_fulfill_left()', number=10000, globals=globals())) +print(timeit('deq_fulfill_left()', number=10000, globals=globals())) +print(timeit('lst_pop(lst_a)', number=100000, globals=globals())) +print(timeit('deq_pop(deq_a)', number=100000, globals=globals())) \ No newline at end of file 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 From 6520faef835e48aa458389275b63127b5940f179 Mon Sep 17 00:00:00 2001 From: Barrakuda Date: Sun, 16 May 2021 13:49:36 +0200 Subject: [PATCH 2/2] Final commit --- .idea/workspace.xml | 33 +++++++++++++-------- task3.py | 70 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f2feb89..7eebd3b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -19,7 +19,11 @@