From 086cb01adf51bda171ea6464114aab2ea7c4d00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Thu, 27 Jul 2023 00:24:09 +0300 Subject: [PATCH 1/4] =?UTF-8?q?HW=2010=20(1)=20HW11=20(1)=20=D0=9F=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D1=81=D1=91=20=D1=87=D1=82=D0=BE=20=D1=83?= =?UTF-8?q?=D1=81=D0=BF=D0=B5=D0=BB.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Practice/Fedorov/HW_10/10.1.py | 74 +++++++++++++++++++++++++++ Practice/Fedorov/HW_11/11.1_client.py | 15 ++++++ Practice/Fedorov/HW_11/11.1_server.py | 28 ++++++++++ 3 files changed, 117 insertions(+) create mode 100644 Practice/Fedorov/HW_10/10.1.py create mode 100644 Practice/Fedorov/HW_11/11.1_client.py create mode 100644 Practice/Fedorov/HW_11/11.1_server.py diff --git a/Practice/Fedorov/HW_10/10.1.py b/Practice/Fedorov/HW_10/10.1.py new file mode 100644 index 0000000..89f404d --- /dev/null +++ b/Practice/Fedorov/HW_10/10.1.py @@ -0,0 +1,74 @@ +# Написать функцию 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 + +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 = [] + thr = threading.Thread(target=find_primes, args=(3, 10000)) + thr.start() + threads.append(thr) + thr = threading.Thread(target=find_primes, args=(10001, 20000)) + thr.start() + threads.append(thr) + thr = threading.Thread(target=find_primes, args=(20001, 30000)) + thr.start() + threads.append(thr) + + for thr in threads: + thr.join() + print(f"Время работы через поток: {int(time.perf_counter() - start_tread)}") + + start_multi = time.perf_counter() + multi = [] + mult = multiprocessing.Process(target=find_primes, args=(3, 10000)) + mult.start() + multi.append(mult) + mult = multiprocessing.Process(target=find_primes, args=(10001, 20000)) + mult.start() + multi.append(mult) + mult = multiprocessing.Process(target=find_primes, args=(20001, 30000)) + mult.start() + multi.append(mult) + + for mult in multi: + mult.join() + print(f"Время работы чере мульти-поток: {int(time.perf_counter() - start_multi)}") \ No newline at end of file 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..1bfac22 --- /dev/null +++ b/Practice/Fedorov/HW_11/11.1_client.py @@ -0,0 +1,15 @@ +import socket +import pickle + +slova = [1, 2, 3] + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +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) +s.close() 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..234cabf --- /dev/null +++ b/Practice/Fedorov/HW_11/11.1_server.py @@ -0,0 +1,28 @@ +# Написать клиентское и серверное приложения. Клиент отправляет на сервер список +# зашифрованных слов, сервер дешифрует слова по словарю и возвращает клиенту +# список расшифрованных слов. Клиент должен вывести полученный список. + +import socket +import pickle + +slovar = {1: "Дом", 2: "Квартира", 3: "Машина", 4: "Дача"} + +def deshifrator(lst): + res = [] + for i in lst: + res.append(slovar.get(i)) + return res + +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 From 8ba759479497313e23640d32b1a9c42b5d71542b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Thu, 10 Aug 2023 22:35:24 +0300 Subject: [PATCH 2/4] HW11 (1) HW12 (1) HW13 (1,2) HW14 (1) --- Practice/Fedorov/HW_11/11.1_client.py | 17 ++++----- Practice/Fedorov/HW_11/11.1_server.py | 27 +++++++------- Practice/Fedorov/HW_12/12.1.py | 35 +++++++++++++++++ Practice/Fedorov/HW_13/13.1.txt | 9 +++++ Practice/Fedorov/HW_13/13.2.py | 54 +++++++++++++++++++++++++++ Practice/Fedorov/HW_14/14_1.py | 49 ++++++++++++++++++++++++ 6 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 Practice/Fedorov/HW_12/12.1.py create mode 100644 Practice/Fedorov/HW_13/13.1.txt create mode 100644 Practice/Fedorov/HW_13/13.2.py create mode 100644 Practice/Fedorov/HW_14/14_1.py diff --git a/Practice/Fedorov/HW_11/11.1_client.py b/Practice/Fedorov/HW_11/11.1_client.py index 1bfac22..d081521 100644 --- a/Practice/Fedorov/HW_11/11.1_client.py +++ b/Practice/Fedorov/HW_11/11.1_client.py @@ -3,13 +3,12 @@ slova = [1, 2, 3] -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -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)) +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) -s.close() + 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 index 234cabf..cfa3f50 100644 --- a/Practice/Fedorov/HW_11/11.1_server.py +++ b/Practice/Fedorov/HW_11/11.1_server.py @@ -13,16 +13,17 @@ def deshifrator(lst): res.append(slovar.get(i)) return res -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 +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..d361ebe --- /dev/null +++ b/Practice/Fedorov/HW_12/12.1.py @@ -0,0 +1,35 @@ +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() + + +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)) From 56b8ef2dceddfbb963415a83dfeffdfd9f409fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Sun, 13 Aug 2023 20:01:53 +0300 Subject: [PATCH 3/4] update 2 --- Practice/Fedorov/HW_10/10.1.py | 19 +++++++++---------- Practice/Fedorov/HW_12/12.1.py | 25 +++++++++++++------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Practice/Fedorov/HW_10/10.1.py b/Practice/Fedorov/HW_10/10.1.py index 89f404d..857056f 100644 --- a/Practice/Fedorov/HW_10/10.1.py +++ b/Practice/Fedorov/HW_10/10.1.py @@ -43,15 +43,14 @@ def find_primes(start, end): print(f"Время работы последовательно: {int(time.perf_counter() - start_time)}") start_tread = time.perf_counter() threads = [] - thr = threading.Thread(target=find_primes, args=(3, 10000)) - thr.start() - threads.append(thr) - thr = threading.Thread(target=find_primes, args=(10001, 20000)) - thr.start() - threads.append(thr) - thr = threading.Thread(target=find_primes, args=(20001, 30000)) - thr.start() - threads.append(thr) + num1 = 3 + num2 = 10000 + for x in range(2): + thr = threading.Thread(target=find_primes, args=(num1, num2)) + thr.start() + threads.append(thr) + num1 += 10000 + num2 += 10000 for thr in threads: thr.join() @@ -71,4 +70,4 @@ def find_primes(start, end): for mult in multi: mult.join() - print(f"Время работы чере мульти-поток: {int(time.perf_counter() - start_multi)}") \ No newline at end of file + print(f"Время работы чере multiprocess: {int(time.perf_counter() - start_multi)}") \ No newline at end of file diff --git a/Practice/Fedorov/HW_12/12.1.py b/Practice/Fedorov/HW_12/12.1.py index d361ebe..54f5aa5 100644 --- a/Practice/Fedorov/HW_12/12.1.py +++ b/Practice/Fedorov/HW_12/12.1.py @@ -21,15 +21,16 @@ def __del__(self): self.conn.close() -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') +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') From c1fee05e74211d2e786d03804b69b67a3024e8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Mon, 14 Aug 2023 21:32:20 +0300 Subject: [PATCH 4/4] update 3 --- Practice/Fedorov/HW_10/10.1.py | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Practice/Fedorov/HW_10/10.1.py b/Practice/Fedorov/HW_10/10.1.py index 857056f..2bdbd02 100644 --- a/Practice/Fedorov/HW_10/10.1.py +++ b/Practice/Fedorov/HW_10/10.1.py @@ -11,7 +11,7 @@ import multiprocessing -def isPrime(n): +def isprime(n): if n % 2 == 0: return n == 2 d = 3 @@ -20,7 +20,7 @@ def isPrime(n): return d * d > n -def isPrimeon(n): +def isprimeon(n): d = 2 while n % d != 0: d += 1 @@ -30,11 +30,26 @@ def isPrimeon(n): def find_primes(start, end): res = [] while start < end: - if isPrimeon(start): + 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) @@ -43,14 +58,7 @@ def find_primes(start, end): print(f"Время работы последовательно: {int(time.perf_counter() - start_time)}") start_tread = time.perf_counter() threads = [] - num1 = 3 - num2 = 10000 - for x in range(2): - thr = threading.Thread(target=find_primes, args=(num1, num2)) - thr.start() - threads.append(thr) - num1 += 10000 - num2 += 10000 + krasivo(threads, True) for thr in threads: thr.join() @@ -58,16 +66,8 @@ def find_primes(start, end): start_multi = time.perf_counter() multi = [] - mult = multiprocessing.Process(target=find_primes, args=(3, 10000)) - mult.start() - multi.append(mult) - mult = multiprocessing.Process(target=find_primes, args=(10001, 20000)) - mult.start() - multi.append(mult) - mult = multiprocessing.Process(target=find_primes, args=(20001, 30000)) - mult.start() - multi.append(mult) + krasivo(multi, False) for mult in multi: mult.join() - print(f"Время работы чере multiprocess: {int(time.perf_counter() - start_multi)}") \ No newline at end of file + print(f"Время работы чере multiprocess: {int(time.perf_counter() - start_multi)}")