diff --git a/Practice/Fedorov/HW_10/10.1.py b/Practice/Fedorov/HW_10/10.1.py new file mode 100644 index 0000000..2bdbd02 --- /dev/null +++ b/Practice/Fedorov/HW_10/10.1.py @@ -0,0 +1,73 @@ +# Написать функцию find_primes(start, end), которая ищет все простые числа +# в диапазоне от заданного числа start (по умолчанию 3) до заданного числа end. Далее необходимо: +# Запустить ее три раза последовательно в диапазоне от 3 до 10000, от 10001 до 20000, от 20001 до 30000. +# Запустить ее три раза с теми же аргументами, но каждый раз в отдельном потоке с помощью threading. +# Thread. Что будет, если 'забыть' выполнить start или join для потоков? +# Запустить ее три раза с теми же аргументами, но каждый раз в отдельном процессе с помощью +# multiprocessing.Process. Что будет, если 'забыть' выполнить start или join для процессов? +# Замерить время исполнения каждого варианта и сравнить результаты. +import time +import threading +import multiprocessing + + +def isprime(n): + if n % 2 == 0: + return n == 2 + d = 3 + while d * d <= n and n % d != 0: + d += 2 + return d * d > n + + +def isprimeon(n): + d = 2 + while n % d != 0: + d += 1 + return d == n + + +def find_primes(start, end): + res = [] + while start < end: + if isprimeon(start): + res.append(start) + start += 1 + return res + +def krasivo(my_lst, istread): + num1 = 3 + num2 = 10000 + for x in range(2): + if istread: + my_lst = threading.Thread(target=find_primes, args=(num1, num2)) + else: + my_lst = multiprocessing.Process(target=find_primes, args=(num1, num2)) + my_lst.start() + my_lst.append(my_lst) + num1 += 10000 + num2 += 10000 + return my_lst + + +if __name__ == '__main__': + start_time = time.perf_counter() + find_primes(3, 10000) + find_primes(10001, 20000) + find_primes(20001, 30000) + print(f"Время работы последовательно: {int(time.perf_counter() - start_time)}") + start_tread = time.perf_counter() + threads = [] + krasivo(threads, True) + + for thr in threads: + thr.join() + print(f"Время работы через поток: {int(time.perf_counter() - start_tread)}") + + start_multi = time.perf_counter() + multi = [] + krasivo(multi, False) + + for mult in multi: + mult.join() + print(f"Время работы чере multiprocess: {int(time.perf_counter() - start_multi)}") diff --git a/Practice/Fedorov/HW_11/11.1_client.py b/Practice/Fedorov/HW_11/11.1_client.py new file mode 100644 index 0000000..d081521 --- /dev/null +++ b/Practice/Fedorov/HW_11/11.1_client.py @@ -0,0 +1,14 @@ +import socket +import pickle + +slova = [1, 2, 3] + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + host = '127.0.0.1' + port = 12345 + s.connect((host, port)) + s.sendall(pickle.dumps(slova)) + d = s.recv(1024) + while d: + print(pickle.loads(d)) + d = s.recv(1024) diff --git a/Practice/Fedorov/HW_11/11.1_server.py b/Practice/Fedorov/HW_11/11.1_server.py new file mode 100644 index 0000000..cfa3f50 --- /dev/null +++ b/Practice/Fedorov/HW_11/11.1_server.py @@ -0,0 +1,29 @@ +# Написать клиентское и серверное приложения. Клиент отправляет на сервер список +# зашифрованных слов, сервер дешифрует слова по словарю и возвращает клиенту +# список расшифрованных слов. Клиент должен вывести полученный список. + +import socket +import pickle + +slovar = {1: "Дом", 2: "Квартира", 3: "Машина", 4: "Дача"} + +def deshifrator(lst): + res = [] + for i in lst: + res.append(slovar.get(i)) + return res + +if __name__ == "__main__" + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + host = "127.0.0.1" + port = 12345 + s.bind((host, port)) + s.listen(5) + while True: + conn, addr = s.accept() + data = pickle.loads(conn.recv(1024)) + print(f"Получено от клиента {addr} сообщение {data}") + data = deshifrator(data) + conn.send(pickle.dumps(data)) + conn.close() + s.close() \ No newline at end of file diff --git a/Practice/Fedorov/HW_12/12.1.py b/Practice/Fedorov/HW_12/12.1.py new file mode 100644 index 0000000..54f5aa5 --- /dev/null +++ b/Practice/Fedorov/HW_12/12.1.py @@ -0,0 +1,36 @@ +import sqlite3 + + +class DB: + + def __init__(self, name): + self.conn = sqlite3.connect(name) + + def execute(self, sql): + self.conn.execute(sql) + self.conn.commit() + + def select(self, sql): + cursor = self.conn.cursor() + cursor.row_factory = sqlite3.Row + cursor.execute(sql) + for row in cursor: + print(dict(row)) + + def __del__(self): + self.conn.close() + + +if __name__ == '__main__': + x = DB('bla.db') + + x.execute("INSERT INTO FLE (ID, NAME, AGE, ADDRESS, SALARY) " + "VALUES (1, 'Paul', 32, 'California', 20000.00)") + x.execute("INSERT INTO FLE (ID, NAME, AGE, ADDRESS, SALARY) " + "VALUES (2, 'Allen', 25, 'Texas', 25000.00)") + x.execute("INSERT INTO FLE (ID, NAME, AGE, ADDRESS, SALARY) " + "VALUES (3, 'Teddy', 23, 'Norway', 20000.00)") + x.execute('UPDATE FLE set salary = 25000.00 WHERE id = 1') + x.execute('DELETE from FLE where id=2;') + x.select('SELECT id, name, address, salary from FLE WHERE id = 1') + x.select('SELECT * from FLE') diff --git a/Practice/Fedorov/HW_13/13.1.txt b/Practice/Fedorov/HW_13/13.1.txt new file mode 100644 index 0000000..6ee73f3 --- /dev/null +++ b/Practice/Fedorov/HW_13/13.1.txt @@ -0,0 +1,9 @@ +Привести два примера предметной области, для представления которых лучше использовать NoSQL-подход. Аргументировать ответ, используя критерии выбора между SQL и NoSQL. + +1) Социальные сети. Критерии: +-Требуемая скорость. Никому не нужно такое приложение, если каждое действие будет долго обрабатываться. Здесь важна скорость. +-Стабильность схемы данных. Социальные сети постоянно развиваются. Поэтому постоянно появляются новые схемы данных, которые нужно вносить в БД. + +2) Приложение для покупки билетов в театр онлайн. +-Требуемая скорость. Пока пользователь ждет действия, представление уже закончится. +-Реляционность данных. Данные по представлению и месту легко представить в плоском виде. \ No newline at end of file diff --git a/Practice/Fedorov/HW_13/13.2.py b/Practice/Fedorov/HW_13/13.2.py new file mode 100644 index 0000000..dc7d56d --- /dev/null +++ b/Practice/Fedorov/HW_13/13.2.py @@ -0,0 +1,54 @@ +# Реализовать NoSQL базу данных для хранения реестра юридических +# лиц, содержащей ИНН, название организации, форму собственности, +# ФИО владельца, адрес. Написать приложение, позволяющее искать данные в базе по ИНН. +import mongoengine as me + + +class UL(me.Document): + inn = me.StringField(required=True, max_length=10, min_length=10) + name_ul = me.StringField(max_length=50) + form_s = me.StringField(max_length=50) + fio = me.StringField(max_length=50) + address = me.StringField(max_length=50) + + def __repr__(self): + return f'UL(inn: {self.inn}, name_ul: {self.name_ul}, '\ + f'form_s: {self.form_s}, fio: {self.fio}, address: {self.address}' + + +conn = me.connect('test') + +UL(inn='1111111111', + name_ul='Sber', + form_s='OOO', + fio='Ivanov I.I.', + address='Moscow').save() + +UL(inn='2111111111', + name_ul='Ашан', + form_s='ПАО', + fio='Пупкин А.И', + address='г.Абакан').save() + +UL(inn='3111111111', + name_ul='Теле2', + form_s='ПАО', + fio='Богатов И.И', + address='г.Симферопль') + +UL(inn='4111111111', + name_ul='Ростелеком', + form_s='ЗАО', + fio='Зотов В.В', + address='г.Рославль') +UL(inn='5111111111', + name_ul='КиБ', + form_s='ООО', + fio='Васильев С.С', + address='г.Бирбиджан') +print('Документов в базе: {}'.format(UL.objects.count())) + +# Делаем запрос +print(UL.objects.filter(inn='1111111111')) +UL.objects.delete() +conn.close() diff --git a/Practice/Fedorov/HW_14/14_1.py b/Practice/Fedorov/HW_14/14_1.py new file mode 100644 index 0000000..5941d40 --- /dev/null +++ b/Practice/Fedorov/HW_14/14_1.py @@ -0,0 +1,49 @@ +# Написать функцию to_roman, которая принимает целое число, а возвращает строку, отображающую +# это число римскими цифрами. Например, на вход подается 6, возвращается - "VI"; +# на вход подается 23, возвращается "XXIII". Входные данные должны быть в диапазоне от 1 до 5000, +# если подается число не из этого диапазона, или не число, то должны выбрасываться ошибка типа NonValidInput. +# Этот тип ошибки надо создать отдельно. Также необходимо в папке с файлом, содержащим вашу функцию, +# создать файл tests.py, внутри которой необходимо определить тесты для вашей функции. +# Тесты должны покрывать все возможное поведение функции, включая порождения ошибки при некорректных входных данных. +class NonValidInput(Exception): + pass + + +def proccess_int(name): + if not name.isnumeric() or int(name) not in range(0, 5001): + raise NonValidInput() + + +def to_roman(x): + dic = {'0': '', '1': 'I', '2': 'II', '3': 'III', '4': 'IV', '5': 'V', '6': 'VI', + '7': 'VII', '8': 'VIII', '9': 'IX'} + s = '' + try: + proccess_int(x) + for ind, i in enumerate(range(len(x), 0, -1)): + raz = int(x[i-1]) + if ind == 0: + s = dic[x[i-1]] + elif ind == 1 or ind == 2: + desyat = 'X' if ind == 1 else 'C' + desyat1 = 'XL' if ind == 1 else 'CD' + desyat2 = 'L' if ind == 1 else 'D' + desyat3 = 'XC' if ind == 1 else 'CM' + if raz < 4: + s = desyat * raz + s + elif raz == 4: + s = desyat1 + s + elif 4 < raz < 9: + s = desyat2 + desyat * (raz - 5) + s + else: + s = desyat3 + s + elif ind == 3: + s = 'M' * raz + s + + except NonValidInput: + print('Вы ввели не число, либо число вышло из диапазона') + return s + +if __name__ == '__main__': + while (num := input('Введите число до 5000, либо stop: ')).lower() != 'stop': + print(to_roman(num))