From eca2c26957db5226f400a542d835444cf6d14543 Mon Sep 17 00:00:00 2001 From: kodoch Date: Sun, 3 Oct 2021 22:32:37 +0300 Subject: [PATCH 1/9] ready lesson_1 --- .idea/-algorithms_2021.iml | 12 ++++++ .idea/.gitignore | 3 ++ .idea/.name | 1 + .../inspectionProfiles/profiles_settings.xml | 6 +++ .idea/misc.xml | 4 ++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ .../task_1.py" | 30 +++++++------- .../task_2.py" | 22 ++++++++++ .../task_3.py" | 37 +++++++++++++++++ .../task_4.py" | 40 +++++++++++++++++++ 11 files changed, 154 insertions(+), 15 deletions(-) create mode 100644 .idea/-algorithms_2021.iml create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/-algorithms_2021.iml b/.idea/-algorithms_2021.iml new file mode 100644 index 000000000..8b8c39547 --- /dev/null +++ b/.idea/-algorithms_2021.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 000000000..05d4b0187 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +task_1.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 000000000..105ce2da2 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..d56657add --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..23c3b1d4b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 0db5b213e..0916d9c0e 100644 --- "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -22,10 +22,10 @@ def check_1(lst_obj): Алгоритм 3: Создать множество из списка - Сложность: !!!. + Сложность: O(n). """ - lst_to_set = set(lst_obj) # !!! - return lst_to_set # !!! + lst_to_set = set(lst_obj) # O(n) + return lst_to_set # O(1) ############################################################################################# @@ -37,12 +37,12 @@ def check_2(lst_obj): что такой элемент отстутствует в оставшихся справа элементах - Сложность: !!!. + Сложность: O(N^2). """ - for j in range(len(lst_obj)): # !!! - if lst_obj[j] in lst_obj[j+1:]: # !!! - return False # !!! - return True # !!! + for j in range(len(lst_obj)): # O(N) + if lst_obj[j] in lst_obj[j+1:]: # O(N) + return False # O(1) + return True # O(1) ############################################################################################# @@ -53,14 +53,14 @@ def check_3(lst_obj): Вначале выполним для списка сортировку, далее, сравниваем элементы попарно Если присутствуют дубли, они будут находиться рядом. - Сложность: !!! + Сложность: O (N log N) """ - lst_copy = list(lst_obj) # !!! - lst_copy.sort() # !!! - for i in range(len(lst_obj) - 1): # !!! - if lst_copy[i] == lst_copy[i+1]: # !!! - return False # !!! - return True # !!! + lst_copy = list(lst_obj) # O(N) + lst_copy.sort() # O (N log N) + for i in range(len(lst_obj) - 1): # O(N) + if lst_copy[i] == lst_copy[i+1]: # O(1) + return False # O(1) + return True # O(1) ############################################################################################# diff --git "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 500c9941e..b7b6c416b 100644 --- "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -19,3 +19,25 @@ Постарайтесь не использовать ф-ции min() и sort() и другие ф-ции! Подход должен быть максимально алгоритмическим. """ + + +def min_from_lst1(lst): #O(n^2) + min_a = None #O(1) + for i in range(len(lst)): #O(n) + for j in lst: #O(n) + if lst[i] > j: #O(1) + min_a = j #O(1) + return min_a #O(1) + + +def min_from_lst2(lst): # O(n) + min_a = lst[0] # O(1) + for i in lst: # O(n) + if i < min_a: # O(1) + min_a = i # O(1) + return min_a + + +lst1 = (12, 10, 5, 13, 3, 20) +print(min_from_lst1(lst1)) # O(1) +print(min_from_lst2(lst1)) # O(1) \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index 254d357e3..a0d714d28 100644 --- "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -19,4 +19,41 @@ Прошу вас внимательно читать ТЗ и не забыть выполнить все пункты. Задание творческое. Здесь нет жестких требований к выполнению. + +Эффективнее решение номер 2 так как используется линейно-логарифмитическая функция(сортировка), +в первой используется квадратичная(двойной перебор) """ +company = {'HP' : 1000000, + 'Nvidia': 1500000, + 'Intel': 750000, + 'apple': 1750000, + 'Lenovo': 350000} + + +def top_three(dict): # O(N^2) + sorted_values = sorted(dict.values()) # N log (N) + sorted_values = sorted_values[-3:] # O(N) + sorted_dict = {} # O(1) + + for i in sorted_values: # O(N) + for k in dict.keys(): # O(N) + if dict[k] == i: # O(1) + sorted_dict[k] = dict[k] # O(1) + break # O(1) + return sorted_dict # o(1) + + +print(top_three(company)) + + +def top_three2(dict): # N log (N) + sorted_dict = {} # O(1) + sorted_keys = sorted(dict, key=dict.get) # N log (N) + sorted_keys = sorted_keys[-3:] # O(N) + + for i in sorted_keys: # O(N) + sorted_dict[i] = dict[i] # O(1) + return sorted_dict # O(1) + + +print(top_three2(company)) \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index 8afab7315..1f6be8d38 100644 --- "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -25,3 +25,43 @@ Задание творческое. Здесь нет жестких требований к выполнению. """ + +profiles ={ + 'Roman': {'password': '123', + 'activation': True}, + 'Sergey': {'password': '0000', + 'activation': False}, + 'Dmitriy': {'password': '1111', + 'activation': True} +} + + +def check_login(profiles, name, password): + for key, val in profiles.items(): + if name == key: + if val['password'] == password and val['activation'] == True: + return 'Доступ разрешён' + elif val['password'] == password and val['activation'] == False: + return 'Пройдите активацию' + else: + return 'Не верный пароль' + else: + return 'Не верный логин' + + +print(check_login(profiles, 'Sergey', '0000')) + + +def check_login2(profiles, name, password): + if profiles[name] == name: + if profiles[name]['password'] == password and profiles[name]['activations'] == True: + return 'Доступ разрешён' + elif profiles[name]['password'] == password and profiles[name]['activations'] == False: + return 'Пройдите аутентификацию' + else: + return 'Не верный пароль' + else: + return 'Не верный логин' + + +print(check_login(profiles, 'Roman', '123')) \ No newline at end of file From ae392d97ac7f783f898eb3f36a103b389e7bc631 Mon Sep 17 00:00:00 2001 From: kodoch Date: Sun, 3 Oct 2021 22:38:35 +0300 Subject: [PATCH 2/9] Correct task 4 --- .../task_4.py" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index 1f6be8d38..42e493697 100644 --- "a/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 1. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -48,7 +48,7 @@ def check_login(profiles, name, password): else: return 'Не верный логин' - +# O(N) print(check_login(profiles, 'Sergey', '0000')) @@ -63,5 +63,5 @@ def check_login2(profiles, name, password): else: return 'Не верный логин' - +# O(1) print(check_login(profiles, 'Roman', '123')) \ No newline at end of file From 56adca0b26f8fff749c7ef46b345c8e94a6ed7ef Mon Sep 17 00:00:00 2001 From: kodoch Date: Mon, 4 Oct 2021 23:22:56 +0300 Subject: [PATCH 3/9] Ready lesson_2 --- .../task_1.py" | 51 +++++++++++++++++++ .../task_2.py" | 32 ++++++++++++ .../task_4.py" | 25 +++++++++ .../task_6.py" | 29 +++++++++++ .../task_7.py" | 11 ++++ 5 files changed, 148 insertions(+) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index c9a84b5cd..d703a717c 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -28,3 +28,54 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + +# enter = input('Введите операцию (+, -, *, / или 0 для выхода): ') +# while enter != '0': +# first_number = int(input('Введите первое число: ')) +# second_number = int(input('Введите второе число: ')) +# if enter == '+': +# result = first_number + second_number +# elif enter == '-': +# result = first_number - second_number +# elif enter == '*': +# result = first_number * second_number +# elif enter == '/': +# result = first_number / second_number +# print(result) +# enter = input('Введите операцию (+, -, *, / или 0 для выхода): ') + + +def calculator(): + enter = input('Введите операцию (+, -, *, / или 0 для выхода): ') + if enter == '0': + return 'Exit' + elif enter in ['+', '-', '*', '/']: + try: + first_number = int(input('Введите первое число: ')) + except ValueError: + print('Введено не число. Начнём сначала') + return calculator() + try: + second_number = int(input('Введите второе число: ')) + except ValueError: + print('Введено не число. Начнём сначала') + return calculator() + if enter == '+': + result = first_number + second_number + elif enter == '-': + result = first_number - second_number + elif enter == '*': + result = first_number * second_number + elif enter == '/': + try: + result = first_number / second_number + except ZeroDivisionError: + print('Делить на 0 нельзя. Попробуйте снова.') + return calculator() + print('Ваш результат: ', result) + else: + return calculator() + return calculator() + + +print(calculator()) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 76c220470..8fbe22e3d 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -18,3 +18,35 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + +# number = int(input('Введите число: ')) +# even = 0 +# odd = 0 +# while number >= 1: +# check = number % 10 +# if check % 2 == 0: +# even += 1 +# elif check % 2 == 1: +# odd += 1 +# number //= 10 +# +# print(even, odd) + + +def even_odd_count(number, even, odd): + if number < 1: + return f'Количество четных и нечетных цифр в числе равно: ({even}, {odd})' + else: + check = number % 10 + if check % 2 == 0: + even += 1 + elif check % 2 == 1: + odd += 1 + number //= 10 + return even_odd_count(number, even, odd) + + +number = int(input('Введите число: ')) +even = 0 +odd = 0 +print(even_odd_count(number, even, odd)) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index 3593384e2..84059842f 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -15,3 +15,28 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + +# a = int(input('Введите число: ')) +# n = 1 +# total = 0 +# +# while a != 0: +# total += n +# n /= -2 +# a -= 1 +# print(total) + + +def count(repeat, total, n): + if repeat == 0: + return total + else: + total += n + n /= -2 + return count(repeat-1, total, n) + + +repeat = int(input('Введите число: ')) +n = 1 +total = 0 +print(f'Количество элементов: {repeat}, их сумма: {count(repeat, total, n)}') diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_6.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_6.py" index b04190e98..7c287f20b 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_6.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_6.py" @@ -11,3 +11,32 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + +# answer = None +# number = 13 +# while answer != number: +# answer = int(input('Угадай число: ')) +# if answer == number: +# print("Ты выиграл!") +# elif answer > number: +# print("Загаданное число меньше") +# else: +# print("Загаданное число больше") + + +def guess_number(answer, number, attempt): + answer = int(input('Угадай число: ')) + attempt -= 1 + if answer == number: + return 'Ты выиграл' + elif attempt == 0: + return 'Попытки кончились' + elif answer > number: + print('Загаданное число меньше') + return guess_number(answer, number, attempt) + else: + print('Загаданное число больше') + return guess_number(answer, number, attempt) + + +print(guess_number(None, 13, 10)) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" index a15bb109d..d477bbe73 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_7.py" @@ -16,3 +16,14 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + + +def check(n): + if n == 0: + return n + else: + return n + check(n - 1) + + +n = int(input('Введите число: ')) +print(check(n) == n*(n+1)/2) From 908218afc0e4f012d926dd228c06dd56a1a34b77 Mon Sep 17 00:00:00 2001 From: kodoch Date: Tue, 5 Oct 2021 22:09:35 +0300 Subject: [PATCH 4/9] done the third task and fixed the fourth task --- .../task_3.py" | 21 +++++++++++++++++++ .../task_4.py" | 7 +++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index a0374e958..9dbd8e346 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -22,3 +22,24 @@ Решите через рекурсию. Решение через цикл не принимается. Для оценки Отлично в этом блоке необходимо выполнить 5 заданий из 7 """ + +number = 1230 +# number_out = str() +# while number != 0: +# last_number = number % 10 +# number_out += str(last_number) +# number //= 10 +# print(number_out) + + +def reverse_number(number, number_out=str()): + if number == 0: + return number_out + else: + last_number = str(number % 10) + number //= 10 + number_out += last_number + return number_out + reverse_number(number) + + +print(reverse_number(number)) diff --git "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index 84059842f..3ae063671 100644 --- "a/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 2. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -27,7 +27,7 @@ # print(total) -def count(repeat, total, n): +def count(repeat, total=0, n=1): if repeat == 0: return total else: @@ -37,6 +37,5 @@ def count(repeat, total, n): repeat = int(input('Введите число: ')) -n = 1 -total = 0 -print(f'Количество элементов: {repeat}, их сумма: {count(repeat, total, n)}') + +print(f'Количество элементов: {repeat}, их сумма: {count(repeat)}') From 5887f69d3f967f96bf445e02532352f238c02464 Mon Sep 17 00:00:00 2001 From: kodoch Date: Sun, 10 Oct 2021 15:15:40 +0300 Subject: [PATCH 5/9] ready lesson_4 --- .../task_1.py" | 23 +++++ .../task_2.py" | 90 ++++++++++++------- .../task_3.py" | 55 ++++++++++++ .../task_4.py" | 27 +++++- 4 files changed, 161 insertions(+), 34 deletions(-) diff --git "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index ce5c4c275..e2b3eef2a 100644 --- "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -15,6 +15,7 @@ И прошу вас обратить внимание, что то, что часто ошибочно называют генераторами списков, на самом деле к генераторам отношения не имеет. Это называется "списковое включение" - list comprehension. """ +import timeit def func_1(nums): @@ -23,3 +24,25 @@ def func_1(nums): if nums[i] % 2 == 0: new_arr.append(i) return new_arr + + +def func_2(nums): + new_arr = [i for i in nums if i%2 == 1] + return new_arr + + +def func_3(nums): + new_arr = list(map(lambda i: i % 2, nums)) + return new_arr + + +lst1 = range(10000) +print(timeit.repeat('func_1(lst1)', repeat=3, number=1000, globals=globals())) +print(timeit.repeat('func_2(lst1)', repeat=3, number=1000, globals=globals())) +print(timeit.repeat('func_3(lst1)', repeat=3, number=1000, globals=globals())) + +""" +Лучший способ из приведённых выше это "списковые включения". Они работают быстрее чем добавлять по одному значению. +Чуть медленее работает через лямбду функцию. +""" + diff --git "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 6109ebe0c..397f6657a 100644 --- "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -14,34 +14,44 @@ from timeit import timeit from random import randint +STR_CODE_1 =''' +from random import randint + def recursive_reverse(number): if number == 0: return '' return f'{str(number % 10)}{recursive_reverse(number // 10)}' + + +num_100 = 123456 +num_1000 = 1234567890 +''' num_100 = randint(10000, 1000000) num_1000 = randint(1000000, 10000000) num_10000 = randint(100000000, 10000000000000) -print('Не оптимизированная функция recursive_reverse') -print( - timeit( - "recursive_reverse(num_100)", - setup='from __main__ import recursive_reverse, num_100', - number=10000)) -print( - timeit( - "recursive_reverse(num_1000)", - setup='from __main__ import recursive_reverse, num_1000', - number=10000)) -print( - timeit( - "recursive_reverse(num_10000)", - setup='from __main__ import recursive_reverse, num_10000', - number=10000)) - +# print('Не оптимизированная функция recursive_reverse') +# print( +# timeit( +# "recursive_reverse(num_100)", +# setup='from __main__ import recursive_reverse, num_100', +# number=10000)) +# print( +# timeit( +# "recursive_reverse(num_1000)", +# setup='from __main__ import recursive_reverse, num_1000', +# number=10000)) +# print( +# timeit( +# "recursive_reverse(num_10000)", +# setup='from __main__ import recursive_reverse, num_10000', +# number=10000)) + +STR_CODE_2 = ''' +from random import randint def memoize(f): cache = {} @@ -63,19 +73,33 @@ def recursive_reverse_mem(number): return f'{str(number % 10)}{recursive_reverse_mem(number // 10)}' -print('Оптимизированная функция recursive_reverse_mem') -print( - timeit( - 'recursive_reverse_mem(num_100)', - setup='from __main__ import recursive_reverse_mem, num_100', - number=10000)) -print( - timeit( - 'recursive_reverse_mem(num_1000)', - setup='from __main__ import recursive_reverse_mem, num_1000', - number=10000)) -print( - timeit( - 'recursive_reverse_mem(num_10000)', - setup='from __main__ import recursive_reverse_mem, num_10000', - number=10000)) +num_100 = 123456 +num_1000 = 1234567890 +''' + +# print('Оптимизированная функция recursive_reverse_mem') +# print( +# timeit( +# 'recursive_reverse_mem(num_100)', +# setup='from __main__ import recursive_reverse_mem, num_100', +# number=10000)) +# print( +# timeit( +# 'recursive_reverse_mem(num_1000)', +# setup='from __main__ import recursive_reverse_mem, num_1000', +# number=10000)) +# print( +# timeit( +# 'recursive_reverse_mem(num_10000)', +# setup='from __main__ import recursive_reverse_mem, num_10000', +# number=10000)) + + +print(timeit(STR_CODE_1, number=10000)) +print(timeit(STR_CODE_2, number=10000)) + + +''' +При расчёте через строковый способ, мемоизация выполняется дольше. +Ощущение что замеры изначально считают только декоратор, поэтому разница такая большая. +''' diff --git "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index c7118bb15..1dc607bac 100644 --- "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -13,6 +13,8 @@ Без аналитики задание считается не принятым """ +from cProfile import run +import timeit def revers_1(enter_num, revers_num=0): @@ -37,3 +39,56 @@ def revers_3(enter_num): enter_num = str(enter_num) revers_num = enter_num[::-1] return revers_num + + +def revers_4(enter_num): + new_list = list(str(enter_num)) + new_list.reverse() + revers_num = ''.join(new_list) + return revers_num + + + +def main(): + num = 12345686461314648411 + res_1 = revers_1(num) + res_2 = revers_2(num) + res_3 = revers_3(num) + res_4 = revers_4(num) + + +num = 12345686461314648411 + +print(timeit.repeat('revers_1(num)', repeat=3, number=100000, globals=globals())) +print(timeit.repeat('revers_2(num)', repeat=3, number=100000, globals=globals())) +print(timeit.repeat('revers_3(num)', repeat=3, number=100000, globals=globals())) +print(timeit.repeat('revers_4(num)', repeat=3, number=100000, globals=globals())) + +run('main()') + +""" +Худший вариант это рекурсия, за ним следует циклы. +Лучший вариант через приведение в строку и сделать реверс через срез. +Был предложен вариант примерно такой же, только через приведения в список и реверс. +Думал что встроенные функция реверс будет работать быстрее среза. +Ниже сделал проверку по строке кода, доказывающую что был не прав +Мой способ лучше чем циклы и рекурсия, но уступает третьему варианту(через строку и срез). +По cProfile проблемных мест в коде нет. В способе с рекурсий функция вызывалась 21 раз. +""" + + +STR_CODE = ''' +enter_num = 12345686461314648411 +enter_num = str(enter_num) +revers_num = enter_num[::-1] +''' + +LIST_CODE = ''' +enter_num = 12345686461314648411 +new_list = list(str(enter_num)) +new_list.reverse() +''' +print(timeit.repeat(STR_CODE, repeat=3, number=100000)) +print(timeit.repeat(LIST_CODE, repeat=3, number=100000)) + + diff --git "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index f5751f5ca..e1482a8de 100644 --- "a/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 4. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -11,8 +11,9 @@ Без аналитики задание считается не принятым! """ +import timeit -array = [1, 3, 1, 3, 4, 5, 1] +array = [1, 3, 1, 3, 3, 3, 4, 5, 1] def func_1(): @@ -39,5 +40,29 @@ def func_2(): f'оно появилось в массиве {max_2} раз(а)' +def func_3(): + set_array = set(array) + num = 0 + max_3 = 0 + for el in set_array: + cnt = array.count(el) + if max_3 < cnt: + max_3 = cnt + num = el + return f'Чаще всего встречается число {num}, ' \ + f'оно появилось в массиве {max_3} раз(а)' + + print(func_1()) print(func_2()) +print(func_3()) + +print(timeit.repeat('func_1()', repeat=3, number=1000000, globals=globals())) +print(timeit.repeat('func_2()', repeat=3, number=1000000, globals=globals())) +print(timeit.repeat('func_3()', repeat=3, number=1000000, globals=globals())) + +""" +Исходя из замеров, получилось сделать алгоритм быстрее. Было использовано множество, +чтобы убрать из перебора список с повторяющимися позициями. Это ускорило процесс. +""" + From ee30c2e1d258df575a111cdd7e11b216206b703e Mon Sep 17 00:00:00 2001 From: kodoch Date: Sun, 17 Oct 2021 14:19:13 +0300 Subject: [PATCH 6/9] ready lesson_5 --- .../task_1.py" | 43 ++++++++++ .../task_2(class).py" | 58 +++++++++++++ .../task_2.py" | 21 +++++ .../task_3.py" | 85 +++++++++++++++++++ .../task_4.py" | 56 ++++++++++++ 5 files changed, 263 insertions(+) create mode 100644 "\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2(class).py" diff --git "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index cc09ef03c..af9c205d2 100644 --- "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -23,3 +23,46 @@ Предприятия, с прибылью ниже среднего значения: Фирма_2 """ + +from collections import namedtuple + + +def create_info(num): + RES = namedtuple('Resume', 'id company_name quarterly_profit') + resume_parts = RES( + id=num, + company_name=input('Введите название предприятия: : '), + quarterly_profit=list(map(int, input(f'через пробел введите прибыль данного предприятия \n' + f'за каждый квартал(Всего 4 квартала): ').split())) + ) + return resume_parts + + +def average_profit(obj): + lower_average = [] + above_average = [] + total = 0 + for i in obj: + for j in i.quarterly_profit: + total += j + average = total / len(obj) + for i in obj: + if average < sum(i.quarterly_profit): + lower_average.append(i.company_name) + else: + above_average.append(i.company_name) + return average, lower_average, above_average + + +def create_list_company(num): + lst_company = [] + for i in range(num): + lst_company.append(create_info(i+1)) + return lst_company + + +some_list = create_list_company(int(input('Введите данные о количестве предприятий: '))) +result = average_profit(some_list) +print(f'Средняя годовая прибыль всех предприятий: {result[0]}') +print(f'Предприятия, с прибылью выше среднего значения: {", ".join(result[1])}\n') +print(f'Предприятия, с прибылью ниже среднего значения: {", ".join(result[2])}') diff --git "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2(class).py" "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2(class).py" new file mode 100644 index 000000000..66db418b3 --- /dev/null +++ "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2(class).py" @@ -0,0 +1,58 @@ +""" +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() +""" + + +class HexNumber: + def __init__(self, hex_num): + self.hex_num = hex_num + + def __add__(self, other): + + return list(hex(int(''.join(self.hex_num), 16) + int(''.join(other.hex_num), 16)).upper())[2:] + + def __mul__(self, other): + return list(hex(int(''.join(self.hex_num), 16) * int(''.join(other.hex_num), 16)).upper())[2:] + + +first_number = list(input('Введите первое число: ')) +second_number = list(input('Введите второе число: ')) +hx_1 = HexNumber(first_number) +hx_2 = HexNumber(second_number) +res_sum = hx_1 + hx_2 +res_mul = hx_1 * hx_2 +print(f'Сумма: {res_sum}') +print(f'Произведение: {res_mul}') diff --git "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index c7884b649..9f17c7dcd 100644 --- "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -34,3 +34,24 @@ class HexNumber: hx + hx hex() """ +from collections import defaultdict +from functools import reduce + + +def amount(obj): + sum_res = 0 + for val in obj.values(): + sum_res += int(''.join(val), 16) + return f'Сумма: {list(hex(sum_res).upper())[2:]}' + + +def multiplication(obj): + mul = reduce(lambda x,y: x * y, [int(''.join(val), 16) for val in obj.values()]) + return f'Произведение: {list(hex(mul).upper())[2:]}' + + +numbers = defaultdict(list) +numbers['1'] = list(input('Введите первое число: ')) +numbers['2'] = list(input('Введите второе число: ')) +print(amount(numbers)) +print(multiplication(numbers)) diff --git "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index f781236fc..059904ba1 100644 --- "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -11,3 +11,88 @@ В первую очередь необходимо выполнить замеры для ф-ций appendleft, popleft, extendleft дека и для их аналогов у списков. """ + +from timeit import timeit +from collections import deque + + +def create_lst(): + new_lst = [i for i in range(100000)] + return new_lst + + +def create_deque_lst(obj): + deq_obj = deque(obj) + return deq_obj + + +def add_to_list(obj): + obj.append('1') + return obj + + +def add_to_deque(obj): + obj.append('1') + return obj + + +def insert_in_list(obj): + obj.insert(0, '1') + return obj + + +def insert_in_deque(obj): + obj.appendleft('1') + return obj + + +def pop_in_list(obj): + obj.pop() + return obj + + +def pop_in_deque(obj): + obj.pop() + return obj + + +def pop_left_list(obj): + obj.pop(0) + return obj + + +def pop_left_deque(obj): + obj.popleft() + return obj + + +simple_lst = list('0' * 100000) +some_list = create_lst() +some_deque_list = create_deque_lst(simple_lst) +print(f"Создание списка через list: " + f"{timeit('create_lst()', number=100, globals=globals())}") +print(f"Создание списка через deque: " + f"{timeit('create_deque_lst(simple_lst)', number=100, globals=globals())}") +print(f"Добавление значения в конец списка через list: " + f"{timeit('add_to_list(some_list)', number=10000, globals=globals())}") +print(f"Добавление значения в конец списка через deque: " + f"{timeit('add_to_deque(some_deque_list)', number=10000, globals=globals())}") +print(f"Добавление значения в начало списка через list: " + f"{timeit('insert_in_list(some_list)', number=10000, globals=globals())}") +print(f"Добавление значения в начало списка deque: " + f"{timeit('insert_in_deque(some_deque_list)', number=10000, globals=globals())}") +print(f"Удаление значения с конца списка через list: " + f"{timeit('pop_in_list(some_list)', number=10000, globals=globals())}") +print(f"Удаление значения с конца списка через deque: " + f"{timeit('pop_in_deque(some_deque_list)', number=10000, globals=globals())}") +print(f"Удаление значения с начала списка через list: " + f"{timeit('pop_left_list(some_list)', number=10000, globals=globals())}") +print(f"Удаление значения с начала списка через deque: " + f"{timeit('pop_left_deque(some_deque_list)', number=10000, globals=globals())}") + + +""" +Создание deque намного быстрее чем через list. Также быстрее выполняется вставка и удаления в начале списка. +Если удалять/вставлять значения в конец списка, то скорость идиентична. +Ещё преимущестов deque доп.функции облегчающие работу программиста. +""" \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" index d408b9c45..03509da2d 100644 --- "a/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" +++ "b/\320\243\321\200\320\276\320\272 5. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_4.py" @@ -6,3 +6,59 @@ И есть ли смысл исп-ть OrderedDict в Python 3.6 и более поздних версиях? """ +from collections import OrderedDict +from timeit import timeit + + +def create_dict(): + std_dict = {} + for i in range(1000): + std_dict[i] = 'a' + return std_dict + + +def create_od_dict(): + od_dict = OrderedDict() + for i in range(1000): + od_dict[i] = 'a' + return od_dict + + +def get_values(obj): + return obj[0] + + +def get_values_od(obj): + return obj[0] + + +def del_key_dict(obj): + for i in range(10): + obj.pop(i) + + +def del_key_od(obj): + for i in range(10): + obj.pop(i) + + +new_dict = create_dict() +new_od_dict = create_od_dict() +print(f"Создание словаря через dict: " + f"{timeit('create_dict()', number=10000, globals=globals())}") +print(f"Создание словаря через OrderDict: " + f"{timeit('create_od_dict()', number=10000, globals=globals())}") +print(f"Получение элемента из словаря через dict: " + f"{timeit('get_values(new_dict)', number=10000000, globals=globals())}") +print(f"Получение элемента из словаря через OrderDict: " + f"{timeit('get_values_od(new_od_dict)', number=10000000, globals=globals())}") +print(f"Удаление элемента из словаря через dict: " + f"{timeit('del_key_dict(new_dict)', number=1, globals=globals())}") +print(f"Удаление элемента из словаря через OrderDict: " + f"{timeit('del_key_od(new_od_dict)', number=1, globals=globals())}") + + +""" +По всем замерам OrderDict уступает стандартному словарю. +Считаю что использовать его нужно только где это реально необходимо. +""" From ed66669dfe7a659ae71e70ea7586ce5daefd7cfe Mon Sep 17 00:00:00 2001 From: kodoch Date: Tue, 19 Oct 2021 08:07:32 +0300 Subject: [PATCH 7/9] ready lesson_6 --- .../task_1.py" | 57 ++++++++++++++++ .../task_1_1.py" | 49 ++++++++++++++ .../task_1_2.py" | 66 +++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 "\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_1.py" create mode 100644 "\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 919499f65..8051cdc11 100644 --- "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -21,3 +21,60 @@ Попытайтесь дополнительно свой декоратор используя ф-цию memory_usage из memory_profiler С одновременным замером времени (timeit.default_timer())! """ +from timeit import default_timer +import memory_profiler + + +def mem_tm(func): + def wrapper(*args, **kwargs): + m1 = memory_profiler.memory_usage() + t1 = default_timer() + res = func(*args, **kwargs) + time_diff = default_timer() - t1 + m2 = memory_profiler.memory_usage() + mem_diff = m2[0] - m1[0] + return f'Заняло памяти: {mem_diff} MiB\n Заняло времени: {time_diff}, {res}' + return wrapper + + + +@mem_tm +def calc_while(num): + even = 0 + odd = 0 + while num >= 1: + check = num % 10 + if check % 2 == 0: + even += 1 + elif check % 2 == 1: + odd += 1 + num //= 10 + return even, odd + + + +@mem_tm +def calc_rec(): + return rec(12321) + + +def rec(num, even=0, odd=0): + if num < 1: + return even, odd + check = num % 10 + if check % 2 == 0: + even += 1 + elif check % 2 == 1: + odd += 1 + num //= 10 + return rec(num, even, odd) + + +print(f'Рекурсия\n {calc_rec()}') # 0.00390625 MiB, 4.940000000003275e-05 +print(f'Цикл\n {calc_while(12321)}') # 0.0 MiB, 3.2999999999949736e-05 + +""" +Были произведены замеры на выполнении рекусии и с применением циклов +Рекурсия заняло больше памяти и времени, так как во время работы хранит в памяти результаты +каждого вызова функции. +""" \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_1.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_1.py" new file mode 100644 index 000000000..5f9a85b71 --- /dev/null +++ "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_1.py" @@ -0,0 +1,49 @@ +from timeit import default_timer +import memory_profiler + + +def mem_tm(func): + def wrapper(*args, **kwargs): + m1 = memory_profiler.memory_usage() + t1 = default_timer() + res = func(*args, **kwargs) + time_diff = default_timer() - t1 + m2 = memory_profiler.memory_usage() + mem_diff = m2[0] - m1[0] + return f'Заняло памяти: {mem_diff} MiB\nЗаняло времени: {time_diff}\nвыходные данные: {res}' + return wrapper + + +class Road: + def __init__(self, length, width): + self._length = length + self._width = width + + @mem_tm + def calc_weight(self): + weight = self._length * self._width * 25 * 5 + return f'{weight}кг' + + +class Road_s: + __slots__ = ['length', 'width'] + def __init__(self, length, width): + self.length = length + self.width = width + + @mem_tm + def calc_weight(self): + weight = self.length * self.width * 25 * 5 + return f'{weight}кг' + + +a = Road(979879979000000, 900000000798646500) +b = Road_s(979879979000000, 900000000798646500) +print(a.calc_weight()) # 0.00390625 MiB, 1.9899999999961615e-05 +print(b.calc_weight()) # 0.0 MiB, 2.3200000000000998e-05 + +""" +Были использованы слоты в классах. Слоты хранят данные не в словарях, +а списках, что значительно сказывается на памяти. Но в некоторых замерах видно что скорость +может снизиться, т.к в словарях доступ к значениям с константной сложностью. +""" \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" new file mode 100644 index 000000000..bbff2378c --- /dev/null +++ "b/\320\243\321\200\320\276\320\272 6. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1_2.py" @@ -0,0 +1,66 @@ +from timeit import default_timer +import memory_profiler + +def mem_tm(func): + def wrapper(*args, **kwargs): + m1 = memory_profiler.memory_usage() + t1 = default_timer() + res = func(*args, **kwargs) + time_diff = default_timer() - t1 + m2 = memory_profiler.memory_usage() + mem_diff = m2[0] - m1[0] + return f'Заняло памяти: {mem_diff} MiB\n Заняло времени: {time_diff}' + return wrapper + + +@mem_tm +def lesson_1(): + start_list = [] + total_1 = 0 + total_2 = 0 + for i in range(1, 100000, 2): + number = i ** 3 + start_list.append(number) + for i in start_list: + count = 0 + for number in str(i): + count += int(number) + if not count % 7: + total_1 += i + for i in start_list: + i += 17 + count = 0 + for number in str(i): + count += int(number) + if not count % 7: + total_2 += i + return total_1, total_2 + + +@mem_tm +def lesson_1_fix(): + start_list = [i**3 for i in range(1, 100000, 2)] + total_1 = 0 + total_2 = 0 + for i in start_list: + count_1 = 0 + count_2 = 0 + for number in str(i): + count_1 += int(number) + if not count_1 % 7: + total_1 += i + for number in str(i+17): + count_2 += int(number) + if not count_2 % 7: + total_2 += i + del start_list + return total_1, total_2 + + +print(f'Циклы с первого урока основ Python:\n {lesson_1()}') # 0.2421875 MiB, 0.2659444000000001 +print(f'Оптимизация первого урока основ Python:\n {lesson_1_fix()}') # 0.0 MiB, 0.2265212000000001 + +""" +Оптимизировано создание списка через ls. в конце функции удалил созданный список, т.к далее он уже не используется. +Тем самым высвободили память. +""" \ No newline at end of file From b5a92ed20944882ba89de99695287ef26a73c3dc Mon Sep 17 00:00:00 2001 From: kodoch Date: Thu, 21 Oct 2021 22:46:07 +0300 Subject: [PATCH 8/9] Ready lesson_7 --- .../task_1.py" | 80 +++++++++++++++++++ .../task_2.py" | 57 +++++++++++++ .../task_3.py" | 51 ++++++++++++ 3 files changed, 188 insertions(+) diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index 724c38110..1c89d098e 100644 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -17,3 +17,83 @@ Сделайте выводы!!! Опишите в чем была ваша доработка и помогла ли вам доработка?? """ + +import timeit +import random + + +def bubble_sort(lst_obj): + n = 1 + while n < len(lst_obj): + for i in range(len(lst_obj)-1, n-1, -1): + if lst_obj[i] < lst_obj[i-1]: + lst_obj[i], lst_obj[i-1] = lst_obj[i-1], lst_obj[i] + n += 1 + return lst_obj + + +def bubble_sort_optimized(lst_obj): + n = 1 + while n < len(lst_obj): + stop = True + for i in range(len(lst_obj)-1, n-1, -1): + if lst_obj[i] < lst_obj[i-1]: + lst_obj[i], lst_obj[i-1] = lst_obj[i-1], lst_obj[i] + stop = False + n += 1 + if stop: + break + return lst_obj + + +orig_list = [random.randint(-100, 100) for _ in range(5)] + + +print( + timeit.timeit( + "bubble_sort(orig_list[:])", + globals=globals(), + number=1000)) # 0.0023228999999999993 +print( + timeit.timeit( + "bubble_sort_optimized(orig_list[:])", + globals=globals(), + number=1000)) # 0.0019711999999999993 + +orig_list = [random.randint(-100, 100) for _ in range(100)] + +# замеры 100 +print( + timeit.timeit( + "bubble_sort(orig_list[:])", + globals=globals(), + number=1000)) # 0.6197293 +print( + timeit.timeit( + "bubble_sort_optimized(orig_list[:])", + globals=globals(), + number=1000)) # 0.6030686000000001 + +orig_list = [random.randint(-100, 100) for _ in range(1000)] + +# замеры 1000 +print( + timeit.timeit( + "bubble_sort(orig_list[:])", + globals=globals(), + number=1000)) # 61.7965873 +print( + timeit.timeit( + "bubble_sort_optimized(orig_list[:])", + globals=globals(), + number=1000)) # 64.95550169999999 + +''' +Взяты замеры времени после оптимизации, путём остановки цикла, в случае +если не было перестановок за проход по массиву. +из резултатов видно что на маленьких и средних массивах, есть положительная динамика, +но на большом массиве ухудшение. +Считаю что данная оптимизация не уместна, так как +по времени одно и тоже, а код выглядит массивней, есть множественное лишнее присваивание True/False флагу остановки. +Время показывает лучше только в том случае если массив в конце будет отсортирован +''' \ No newline at end of file diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 905882f52..bd2fc3ab0 100644 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -13,3 +13,60 @@ Исходный - [46.11436617832828, 41.62921998361278, 18.45859540989644, 12.128870723745806, 8.025098788570562] Отсортированный - [8.025098788570562, 12.128870723745806, 18.45859540989644, 41.62921998361278, 46.11436617832828] """ +import timeit +import random + + +def merge_two_list(a, b): + c = [] + i = j = 0 + while i < len(a) and j < len(b): + if a[i] < b[j]: + c.append(a[i]) + i += 1 + else: + c.append(b[j]) + j += 1 + if i < len(a): + c += a[i:] + if j < len(b): + c += b[j:] + return c + + +def merge_sort(lst_obj): + if len(lst_obj) == 1: + return lst_obj + middle = len(lst_obj) // 2 + left = merge_sort(lst_obj[:middle]) + right = merge_sort(lst_obj[middle:]) + return merge_two_list(left, right) + + +orig_list = [random.uniform(0, 50) for _ in range(10)] +# замеры 10 +print( + timeit.timeit( + "merge_sort(orig_list[:])", + globals=globals(), + number=1000)) +print(f'Исходный - {orig_list} \nОтсортированный - {merge_sort(orig_list[:])}') + +orig_list = [random.uniform(0, 50) for _ in range(100)] + +# замеры 100 +print( + timeit.timeit( + "merge_sort(orig_list[:])", + globals=globals(), + number=1000)) +print(f'Исходный - {orig_list} \nОтсортированный - {merge_sort(orig_list[:])}') +orig_list = [random.uniform(0, 50) for _ in range(1000)] + +# замеры 1000 +print( + timeit.timeit( + "merge_sort(orig_list[:])", + globals=globals(), + number=1000)) +print(f'Исходный - {orig_list} \nОтсортированный - {merge_sort(orig_list[:])}') diff --git "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" index 66eac80ca..82d6ec443 100644 --- "a/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" +++ "b/\320\243\321\200\320\276\320\272 7. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_3.py" @@ -40,3 +40,54 @@ """ +import random +from statistics import median +from timeit import timeit + + +# Сортировкой +def shell(n): + m = 2 * n + 1 + my_lst = [random.randint(0, 100) for _ in range(m)] + inc = len(my_lst) // 2 + while inc: + for i, el in enumerate(my_lst): + while i >= inc and my_lst[i - inc] > el: + my_lst[i] = my_lst[i - inc] + i -= inc + my_lst[i] = el + inc = 1 if inc == 2 else int(inc * 5.0 / 11) + return f'Медиана: {my_lst[n]}, с индексом: {n} ' + + +# statistics +def static(n): + m = 2 * n + 1 + my_lst = [random.randint(0, 100) for _ in range(m)] + return f'Медиана: {median(my_lst)}, с индексом: {n} ' + + +# Без сортировки +def not_sort(n): + m = 2 * n + 1 + my_lst = [random.randint(0, 100) for _ in range(m)] + while (len(my_lst)) != n+1: + my_lst.remove(max(my_lst)) + return f'Медиана: {max(my_lst)}, с индексом: {n} ' + + +print(f'Сортировка Шелла(7): {timeit("shell(3)", globals=globals(), number=30000)}') +print(f'Методом median(7): {timeit("static(3)", globals=globals(), number=30000)}') +print(f'Без сортировки(7): {timeit("not_sort(3)", globals=globals(), number=30000)}') +print(f'Сортировка Шелла(21): {timeit("shell(10)", globals=globals(), number=10000)}') +print(f'Методом median(21): {timeit("static(10)", globals=globals(), number=10000)}') +print(f'Без сортировки(21): {timeit("not_sort(10)", globals=globals(), number=10000)}') +print(f'Сортировка Шелла(31): {timeit("shell(15)", globals=globals(), number=10000)}') +print(f'Методом median(31): {timeit("static(15)", globals=globals(), number=10000)}') +print(f'Без сортировки(31): {timeit("not_sort(15)", globals=globals(), number=10000)}') + +""" +На массиве с длиной в 7 значений, без сортировки и через медиан практически одинаковы. +При увеличении длины массива, самый быстрый способ через медиан. Далее без сортировки. +Самый долгий способ через сортировку. +""" \ No newline at end of file From f00228dd4e03b1773ec53e0d5c538eef72c0f013 Mon Sep 17 00:00:00 2001 From: kodoch Date: Tue, 26 Oct 2021 21:01:25 +0300 Subject: [PATCH 9/9] Ready leeson_8 --- .../task_1.py" | 55 ++++++++++++++++ .../task_2.py" | 63 ++++++++++++------- 2 files changed, 95 insertions(+), 23 deletions(-) diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" index f5a00a266..b22881faa 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_1.py" @@ -9,3 +9,58 @@ 2) тема понятна? постарайтесь сделать свою реализацию. Вы можете реализовать задачу, например, через ООП или предложить иной подход к решению. """ + +from collections import Counter, deque + +ch_table = {} + + +def make_tree(s): + # Считаем количество повторов символов + count = Counter(s) + # Сортируем по возрастанию + sorted_el = deque(sorted(count.items(), key=lambda items: items[1])) + + # Цикл пока не соберём всё под один корень + while len(sorted_el) > 1: + # Считаем вес первого и второго символа + weight = sorted_el[0][1] + sorted_el[1][1] + + # Вырезаем первый и второй символ. Собираем их в словарь для дальнейшей вставки + concat = {0: sorted_el.popleft()[0], + 1: sorted_el.popleft()[0]} + + # Перебираем все оставшиеся символы с их весом и выбираем верное место вставки + for i, val in enumerate(sorted_el): + if weight > val[1]: + # Если вес вставляемого словаря меньше чем у выбранного символа, то сразу переходим к следующему символу + continue + else: + # Если вес словаря больше, то вставляем его после символа с меньшим весом и останавливаем перебор + sorted_el.insert(i, (concat, weight)) + break + # Если перебирать нечего, тогда вставляем в пустой список deque собранное дерево и его окончательный вес + else: + sorted_el.append((concat, weight)) + # Возвращаем само дерево, а не deque + return sorted_el[0][0] + + +# Рекурсивно собираем словарь из дерева на вход +def encode_haff(tree, path=''): + # если на входе данные являются не словарём, то записываем + if not isinstance(tree, dict): + ch_table[tree] = path + else: + # Делим деревья и проверяем глубже, доставая элементы и замеряя к ним путь, собирая код + encode_haff(tree[0], path=f'{path}0') + encode_haff(tree[1], path=f'{path}1') + + +s = 'А роза упала на лапу Азора' +tree = make_tree(s) +print(tree) +encode_haff(tree) +print(ch_table) +for i in s: + print(f'"{i}": {ch_table[i]}') diff --git "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" index 383181907..63256e4be 100644 --- "a/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" +++ "b/\320\243\321\200\320\276\320\272 8. \320\237\321\200\320\260\320\272\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265/task_2.py" @@ -10,6 +10,7 @@ Поработайте с доработанной структурой, позапускайте на реальных данных - на клиентском коде. """ + class BinaryTree: def __init__(self, root_obj): # корень @@ -21,33 +22,45 @@ def __init__(self, root_obj): # добавить левого потомка def insert_left(self, new_node): - # если у узла нет левого потомка - if self.left_child == None: - # тогда узел просто вставляется в дерево - # формируется новое поддерево - self.left_child = BinaryTree(new_node) - # если у узла есть левый потомок + try: + if new_node > self.root: + raise ValueError + except ValueError: + print('Значение больше корня. Потомок не добавлен') else: - # тогда вставляем новый узел - tree_obj = BinaryTree(new_node) - # и спускаем имеющегося потомка на один уровень ниже - tree_obj.left_child = self.left_child - self.left_child = tree_obj + # если у узла нет левого потомка + if self.left_child == None: + # тогда узел просто вставляется в дерево + # формируется новое поддерево + self.left_child = BinaryTree(new_node) + # если у узла есть левый потомок + else: + # тогда вставляем новый узел + tree_obj = BinaryTree(new_node) + # и спускаем имеющегося потомка на один уровень ниже + tree_obj.left_child = self.left_child + self.left_child = tree_obj # добавить правого потомка def insert_right(self, new_node): - # если у узла нет правого потомка - if self.right_child == None: - # тогда узел просто вставляется в дерево - # формируется новое поддерево - self.right_child = BinaryTree(new_node) - # если у узла есть правый потомок + try: + if new_node < self.root: + raise ValueError + except ValueError: + print('Значение меньше корня. Потомок не добавлен') else: - # тогда вставляем новый узел - tree_obj = BinaryTree(new_node) - # и спускаем имеющегося потомка на один уровень ниже - tree_obj.right_child = self.right_child - self.right_child = tree_obj + # если у узла нет правого потомка + if self.right_child == None: + # тогда узел просто вставляется в дерево + # формируется новое поддерево + self.right_child = BinaryTree(new_node) + # если у узла есть правый потомок + else: + # тогда вставляем новый узел + tree_obj = BinaryTree(new_node) + # и спускаем имеющегося потомка на один уровень ниже + tree_obj.right_child = self.right_child + self.right_child = tree_obj # метод доступа к правому потомку def get_right_child(self): @@ -70,10 +83,14 @@ def get_root_val(self): print(r.get_root_val()) print(r.get_left_child()) r.insert_left(40) +r.insert_left(5) print(r.get_left_child()) print(r.get_left_child().get_root_val()) -r.insert_right(12) +r.insert_right(6) +r.insert_right(10) print(r.get_right_child()) print(r.get_right_child().get_root_val()) r.get_right_child().set_root_val(16) print(r.get_right_child().get_root_val()) + +