-
Notifications
You must be signed in to change notification settings - Fork 0
HW 10 (1)HW11 (1) #152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
HW 10 (1)HW11 (1) #152
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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): | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Может, range(3) ? |
||
| 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() | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Так my_lst - это поток, процесс или список? |
||
| my_lst.append(my_lst) | ||
| num1 += 10000 | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 3 + 10000 => 10003, а не 10001 |
||
| 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)}") | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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') |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| Привести два примера предметной области, для представления которых лучше использовать NoSQL-подход. Аргументировать ответ, используя критерии выбора между SQL и NoSQL. | ||
|
|
||
| 1) Социальные сети. Критерии: | ||
| -Требуемая скорость. Никому не нужно такое приложение, если каждое действие будет долго обрабатываться. Здесь важна скорость. | ||
| -Стабильность схемы данных. Социальные сети постоянно развиваются. Поэтому постоянно появляются новые схемы данных, которые нужно вносить в БД. | ||
|
|
||
| 2) Приложение для покупки билетов в театр онлайн. | ||
| -Требуемая скорость. Пока пользователь ждет действия, представление уже закончится. | ||
| -Реляционность данных. Данные по представлению и месту легко представить в плоском виде. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ожидаются ответы на вопросы в задании. Можно в виде комментариев.