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
73 changes: 73 additions & 0 deletions Practice/Fedorov/HW_10/10.1.py
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ожидаются ответы на вопросы в задании. Можно в виде комментариев.

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):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The 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()
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так my_lst - это поток, процесс или список?

my_lst.append(my_lst)
num1 += 10000
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The 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)}")
14 changes: 14 additions & 0 deletions Practice/Fedorov/HW_11/11.1_client.py
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)
29 changes: 29 additions & 0 deletions Practice/Fedorov/HW_11/11.1_server.py
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()
36 changes: 36 additions & 0 deletions Practice/Fedorov/HW_12/12.1.py
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')
9 changes: 9 additions & 0 deletions Practice/Fedorov/HW_13/13.1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Привести два примера предметной области, для представления которых лучше использовать NoSQL-подход. Аргументировать ответ, используя критерии выбора между SQL и NoSQL.

1) Социальные сети. Критерии:
-Требуемая скорость. Никому не нужно такое приложение, если каждое действие будет долго обрабатываться. Здесь важна скорость.
-Стабильность схемы данных. Социальные сети постоянно развиваются. Поэтому постоянно появляются новые схемы данных, которые нужно вносить в БД.

2) Приложение для покупки билетов в театр онлайн.
-Требуемая скорость. Пока пользователь ждет действия, представление уже закончится.
-Реляционность данных. Данные по представлению и месту легко представить в плоском виде.
54 changes: 54 additions & 0 deletions Practice/Fedorov/HW_13/13.2.py
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()
49 changes: 49 additions & 0 deletions Practice/Fedorov/HW_14/14_1.py
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))