Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions Lesson - 3/task_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""
Задание 1.
Реализуйте свои пользовательские функции, в которых реализуйте:
a) заполнение списка и словаря программно,
сделайте замеры и сделайте выводы, что выполняется быстрее и почему
b) выполните набор операций и со списком, и со словарем,
сделайте замеры и сделайте выводы, что и где выполняется быстрее и почему
Подсказка: для замеров воспользуйтесь модулем time (см. примеры урока 1)
Примечание: вы уже знаете, что такое декоратор и как его реализовать,
то реализуйте ф-цию-декоратор для подсчета времени работы ваших пользовательских функций
И примените ее к своим функциям!
"""

# работа со списком выполняется быстрее чем со словорем потому, что
# у словарей дополнительно затрачено время на вычисление хешей

import time


listing = []


def filling_li(li):

start = time.time()
for i in range(0, 100000):
li.append(i)

end = time.time()
return listing, print(end - start)


filling_li(listing)


def sum_time_append(x):
start = time.time()
for i in range(x):
listing.append(2)
end = time.time()
return end - start


print(sum_time_append(100000))


def sum_time_len(x):
start = time.time()
for i in range(x):
len(listing)
end = time.time()
return end - start


print(sum_time_len(100000))


########################################################################################################################

diction = {}


def filling_dict(dic):

start = time.time()
for i in range(0, 100000):
dic[i] = i
end = time.time()
return diction, print(end - start)


filling_dict(diction)


def sum_time_up(x):
start = time.time()
for i in range(x):
diction.update({25: 25})
end = time.time()
return end - start


print(sum_time_up(100000))


def sum_time_len2(x):
start = time.time()
for i in range(x):
len(diction)
end = time.time()
return end - start


print(sum_time_len2(100000))

41 changes: 41 additions & 0 deletions Lesson - 3/task_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from uuid import uuid4
import hashlib


"""
Задание 2.
Ваша программа должна запрашивать пароль *
Для этого пароля вам нужно получить хеш, используя функцию sha256 *
Для генерации хеша обязательно нужно использовать криптографическую соль *
Обязательно выведите созданный хеш *
Далее программа должна запросить пароль повторно
Вам нужно проверить, совпадает ли пароль с исходным
Для проверки необходимо сравнить хеши паролей
ПРИМЕР:
Введите пароль: 123
В базе данных хранится строка: 555a3581d37993843efd4eba1921f1855965535d77c55782349444b
Введите пароль еще раз для проверки: 123
Вы ввели правильный пароль
Допускаются любые усложения задания - валидация, подключение к БД, передача данных в файл
"""


arr_pass = []


def hashing():

passwd = input("Введите пароль: ")
salt = uuid4().hex
res = hashlib.sha256(salt.encode() + passwd.encode()).hexdigest()
print(res)
arr_pass.append(res)
pass2 = input("Введите пароль: ")
res2 = hashlib.sha256(salt.encode() + pass2.encode()).hexdigest()
if res2 in arr_pass:
return print("Вы ввели правельный пароль")
else:
return print("Неверный пароль")


hashing()
29 changes: 29 additions & 0 deletions Lesson - 3/task_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
Задание 3.
Определить количество различных (уникальных) подстрок с использованием хеш-функции.
Дана строка S длиной N, состоящая только из строчных латинских букв.
Подсказка: примените вычисление хешей для подстрок с помощью хеш-функций и множества
Пример:
рара - 6 уникальных подстрок
рар
ра
ар
ара
р
а
"""

mno = set()


def substrings(word):
for beg in range(len(word)):
for end in range(beg, len(word)):
if word[beg:end + 1] != word:
mno.add(hash((word[beg:end + 1])))
return print(word)


substrings("papa")
print(mno)

29 changes: 29 additions & 0 deletions Lesson - 3/task_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

import hashlib

"""
Задание 4.
Реализуйте скрипт "Кэширование веб-страниц"
Функция должна принимать url-адрес и проверять
есть ли в кэше соответствующая страница, если нет, то вносит ее в кэш
Подсказка: задачу решите обязательно с применением 'соленого' хеширования и хеш-таблиц
Можете условжнить задачу, реализовав ее через ООП
Не забудьте, что кэширование - механизм, а хеш-таблица - средство его реализации
"""

url_list = {}


def url(x):

salt = "022cf2d005a201ab60"
new_url = hashlib.sha256(salt.encode() + x.encode()).hexdigest()
if new_url in url_list:
print("Такая уже страница есть")
else:
url_list[new_url] = x

return print(url_list)


url("http")
69 changes: 69 additions & 0 deletions Lesson-5/Task-1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"""
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

quantity_company = int(input("Введите количество компаний для посчета прибыли: "))

companies = namedtuple("Company", "name, quarter_1, quarter_2, quarter_3, quarter_4")


def profit_count(num):
i = 1
list_comp = {}
below_average = []
above_average = []

while i <= num:
i += 1
sum_comp = 0
name = ""
comp = (companies(name=input("Введите название компании: "), quarter_1=int(input("Прибыль за 1 квартал: ")),
quarter_2=int(input("Прибыль за 2 квартал: ")),
quarter_3=int(input("Прибыль за 3 квартал: ")),
quarter_4=int(input("Прибыль за 4 квартал: "))))

for x in comp:
if type(x) == str:
name = x
else:
sum_comp += x

list_comp[name] = sum_comp

average_amount = sum(list_comp.values()) / (i-1)
print(f"Средняя годовая прибыль: {average_amount}")

for key, value in list_comp.items():
if average_amount > value:
above_average.append(key)
else:
below_average.append(key)

print(f"Предприятия, с прибылью выше среднего значения: {''.join(above_average)}")
print(f"Предприятия, с прибылью ниже среднего значения: {''.join(below_average)}")


profit_count(quantity_company)
60 changes: 60 additions & 0 deletions Lesson-5/Task-2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""
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
"""

from collections import defaultdict

one_default = defaultdict(list)
one_default[1] = list((input("Введите первое число в шестнадцатиричной системе: ").upper()))
one_default[2] = list((input("Введите втрое число в шестнадцатиричной системе: ").upper()))


def sum_default(x):
s = 0
for key, value in x.items():
if sum == 0:
s = int((''.join(value)), 16)
else:
s += int((''.join(value)), 16)
return print(f"Сумма чисел ровна: {list(hex(s)[2:].upper())}")


def work_default(x):
s = 0
for key, value in x.items():
if s == 0:
s = int((''.join(value)), 16)
else:
s = s * int((''.join(value)), 16)
return print(f"Сумма чисел ровна: {list(hex(s)[2:].upper())}")


sum_default(one_default)
work_default(one_default)

63 changes: 63 additions & 0 deletions Lesson-5/Task-3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""
Задача 3.
В соответствии с документацией Python,
deque – это обобщение стеков и очередей.
Вот основное правило: если вам нужно что-то быстро дописать или вытащить, используйте deque.
Если вам нужен быстрый случайный доступ, используйте list.
Задача: создайте простой список (list) и очередь (deque).
Выполните различные операции с каждым из объектов.
Сделайте замеры и оцените, насколько информация в документации
соответствует дейстивтельности.
Операции равные по семантике (по смыслу)
Но разные по используемым ф-циям
И добавить аналитику, так ли это или нет.!
"""

# Итог: вслучае использования встроенных функций deque по скорости будет быстрее, однако при случае где нужен
# непосредственно доступ к элементу по скорости он проигрывает


from timeit import timeit
from collections import deque


one = list("ssd")
two = list("zxc")

deq_one = deque(one)

deq_app = deq_one.appendleft("s")
print(timeit("deq_app", globals=globals()))

list_app = two.insert(0, "d")
print(timeit("list_app", globals=globals()))

deq_pop = deq_one.popleft()
print(timeit("deq_pop", globals=globals()))

list_pop = two.pop()
print(timeit("list_pop", globals=globals()))


def deq(x):
for i in x:
i += i


print(timeit("deq(deq_one)", globals=globals(),))


def li(y):
for i in y:
i += i


print(timeit("li(two)", globals=globals()))


# 0.030690670000000003
# 0.025808605
# 0.034939417000000014
# 0.025737818999999995
# 0.409890953
# 0.42161804199999997
Loading