From b30e5fc769c9e96b4b1ba0a695144d089f984785 Mon Sep 17 00:00:00 2001 From: nsa Date: Tue, 14 Nov 2023 20:42:35 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=94.=D0=B7.=20=D0=BF=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=209=20"=D0=A0=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20Python"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_lec_9_task1.py | 17 +++++++++++++ .../nskorokhodova/Practice_lec_9_task2.py | 4 ++++ .../nskorokhodova/Practice_lec_9_task3.py | 14 +++++++++++ .../nskorokhodova/Practice_lec_9_task4.py | 24 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 Practice/nskorokhodova/Practice_lec_9_task1.py create mode 100644 Practice/nskorokhodova/Practice_lec_9_task2.py create mode 100644 Practice/nskorokhodova/Practice_lec_9_task3.py create mode 100644 Practice/nskorokhodova/Practice_lec_9_task4.py diff --git a/Practice/nskorokhodova/Practice_lec_9_task1.py b/Practice/nskorokhodova/Practice_lec_9_task1.py new file mode 100644 index 00000000..87830cf5 --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_9_task1.py @@ -0,0 +1,17 @@ +class ParagraphIterator: + def __init__(self, text, paragraph_symbol): + self.text = text + self.paragraph_symbol = paragraph_symbol + self.paragraphs = text.split(paragraph_symbol) + self.current_paragraph = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.current_paragraph >= len(self.paragraphs): + raise StopIteration + + paragraph = self.paragraphs[self.current_paragraph] + self.current_paragraph += 1 + return paragraph.strip() diff --git a/Practice/nskorokhodova/Practice_lec_9_task2.py b/Practice/nskorokhodova/Practice_lec_9_task2.py new file mode 100644 index 00000000..b3c8e9fc --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_9_task2.py @@ -0,0 +1,4 @@ +path_to_file = "C:\Python\python.exe\Files\info.txt" +with open(path_to_file) as file: + for num_line, line in enumerate(file): + print(num_line, line) diff --git a/Practice/nskorokhodova/Practice_lec_9_task3.py b/Practice/nskorokhodova/Practice_lec_9_task3.py new file mode 100644 index 00000000..d5b2eaa9 --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_9_task3.py @@ -0,0 +1,14 @@ +import time + + +class MyTime: + def __enter__(self): + self._start_time = time.time() + print("Начало исполнения кода") + + def __exit__(self, exc_type, exc_val, exc_tb): + print(f"Время исполнения {time.time() - self._start_time}") + + +with MyTime(): + time.sleep(1) diff --git a/Practice/nskorokhodova/Practice_lec_9_task4.py b/Practice/nskorokhodova/Practice_lec_9_task4.py new file mode 100644 index 00000000..9a8634f8 --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_9_task4.py @@ -0,0 +1,24 @@ +import itertools + + +def my_iter_merge(arr1, arr2, arr3): + return list(itertools.chain(arr1 + arr2 + arr3)) + + +def my_iter_len(arr): + return list(filter(lambda x: len(x) >= 5, arr)) + + +def my_iter_comb(my_pass): + for i in itertools.combinations(my_pass, 4): + print(i) + + +first_task = ([1, 2, 3], [4, 5], [6, 7]) +print(my_iter_merge(*first_task)) + +second_task = (["hello", "i", "write", "cool", "code"]) +print(my_iter_len(second_task)) + +third_task = "password" +my_iter_comb(third_task) From c928558b3a100de1689b8581a89d123630814993 Mon Sep 17 00:00:00 2001 From: nsa Date: Wed, 15 Nov 2023 01:15:58 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=94.=D0=B7.=20=D0=BF=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=209=20"=D0=A0=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20Python"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Practice/nskorokhodova/Practice_lec_9_task2.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Practice/nskorokhodova/Practice_lec_9_task2.py b/Practice/nskorokhodova/Practice_lec_9_task2.py index b3c8e9fc..3f1c9212 100644 --- a/Practice/nskorokhodova/Practice_lec_9_task2.py +++ b/Practice/nskorokhodova/Practice_lec_9_task2.py @@ -1,4 +1,8 @@ -path_to_file = "C:\Python\python.exe\Files\info.txt" -with open(path_to_file) as file: - for num_line, line in enumerate(file): - print(num_line, line) +def read_file(file_path): + with open(file_path, 'r') as file: + for line in file: + yield line.rstrip('\n') + +file_path = 'C:\Python\python.exe\..\Files\info.txt' +for line in read_file(file_path): + print(line) From eb37aa083d56748016eb926734a7cd15cac0ce59 Mon Sep 17 00:00:00 2001 From: nsa Date: Wed, 15 Nov 2023 01:23:15 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=94.=D0=B7.=20=D0=BF=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=2010=20"=D0=91=D0=B8=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_lec_10_task1.py | 12 ++++++ .../nskorokhodova/Practice_lec_10_task2.py | 32 +++++++++++++++ .../nskorokhodova/Practice_lec_10_task3.py | 30 ++++++++++++++ .../nskorokhodova/Practice_lec_10_task4.py | 40 +++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 Practice/nskorokhodova/Practice_lec_10_task1.py create mode 100644 Practice/nskorokhodova/Practice_lec_10_task2.py create mode 100644 Practice/nskorokhodova/Practice_lec_10_task3.py create mode 100644 Practice/nskorokhodova/Practice_lec_10_task4.py diff --git a/Practice/nskorokhodova/Practice_lec_10_task1.py b/Practice/nskorokhodova/Practice_lec_10_task1.py new file mode 100644 index 00000000..334a972f --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_10_task1.py @@ -0,0 +1,12 @@ +#Используя модуль re, найти все команды Git с аргументами в файле Practice/README.md +import re + + +lst = [] +with open(r"C:\Users\..\Practice\README.md", "r", encoding="utf-8'") as f: + reg = re.compile(r"git\s\w*") + for line in f: + line = line.rstrip('\n') + lst += re.findall(reg, line) + for i in lst: + print(i) diff --git a/Practice/nskorokhodova/Practice_lec_10_task2.py b/Practice/nskorokhodova/Practice_lec_10_task2.py new file mode 100644 index 00000000..ad3ebd57 --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_10_task2.py @@ -0,0 +1,32 @@ +from datetime import datetime, timedelta + + +def count_working_days(start_date, end_date): + start_date = datetime.strptime(start_date, "%Y-%m-%d") + end_date = datetime.strptime(end_date, "%Y-%m-%d") + + holidays = [ + datetime(2023, 1, 1), + datetime(2023, 3, 8), + datetime(2023, 5, 1), + datetime(2023, 5, 9), + datetime(2023, 6, 12), + datetime(2023, 11, 4), + ] + + working_days = 0 + + current_date = start_date + while current_date <= end_date: + if current_date.weekday() < 5 and current_date not in holidays: + working_days += 1 + + current_date += timedelta(days=1) + return working_days + + +start_date = "2023-01-01" +end_date = "2023-01-31" + +result = count_working_days(start_date, end_date) +print("Количество рабочих дней:", result) diff --git a/Practice/nskorokhodova/Practice_lec_10_task3.py b/Practice/nskorokhodova/Practice_lec_10_task3.py new file mode 100644 index 00000000..d8ef3bdb --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_10_task3.py @@ -0,0 +1,30 @@ +import os +import time +import shutil + + +def delete_files_and_folders(path, expiration_time): + current_time = time.time() + + try: + for root, dirs, files in os.walk(path): + for file_name in files: + file_path = os.path.join(root, file_name) + + creation_time = os.path.getctime(file_path) + + if (current_time - creation_time) > expiration_time: + os.remove(file_path) + + for dir_name in dirs: + dir_path = os.path.join(root, dir_name) + + creation_time = os.path.getctime(dir_path) + + if (current_time - creation_time) > expiration_time: + shutil.rmtree(dir_path) + + print("Файлы и папки, у которых истек срок:", path) + + except Exception as e: + print("Ошибка при удалении файлов и папок:", str(e)) diff --git a/Practice/nskorokhodova/Practice_lec_10_task4.py b/Practice/nskorokhodova/Practice_lec_10_task4.py new file mode 100644 index 00000000..48bc9fd2 --- /dev/null +++ b/Practice/nskorokhodova/Practice_lec_10_task4.py @@ -0,0 +1,40 @@ +import pickle +import random + + +class Human: + def __init__(self, name, surname, age, address): + self.name = name + self.surname = surname + self.age = age + self.address = address + + +def create_humans(num_humans): + humans = [] + for _ in range(num_humans): + name = random.choice(["Иван", "Мария", "Михаил", "Александр", "Алла"]) + surname = random.choice(["Иванов", "Олешко", "Смирнов", "Моисеев", "Копытова"]) + age = random.randint(18, 65) + address = random.choice(["Москва", "Лондон", "Нижний Новгород", "Пермь", "Омск"]) + human = Human(name, surname, age, address) + humans.append(human) + return humans + + +def serialize(humans): + with (open("human.data", "wb") as file): + pickle.dump(humans, file) + + +def deserialize(): + with (open("human.data", "rb") as file): + humans = pickle.load(file) + for human in humans: + print(human.name, human.surname, human.age, human.address) + + +x = int(input("Введите число ")) +p = create_humans(x) +serialize(p) +deserialize() From 30c077314ece3b988f77d8386f7b590714da3b5b Mon Sep 17 00:00:00 2001 From: nsa Date: Wed, 15 Nov 2023 23:37:07 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=94.=D0=B7.=20=D0=BF=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=2012=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_lec_10_task4.py | 4 +- .../nskorokhodova/Practice_lec_9_task1.py | 16 +++++ .../nskorokhodova/Practice_mod_12_task1.py | 70 +++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 Practice/nskorokhodova/Practice_mod_12_task1.py diff --git a/Practice/nskorokhodova/Practice_lec_10_task4.py b/Practice/nskorokhodova/Practice_lec_10_task4.py index 48bc9fd2..ec446692 100644 --- a/Practice/nskorokhodova/Practice_lec_10_task4.py +++ b/Practice/nskorokhodova/Practice_lec_10_task4.py @@ -23,12 +23,12 @@ def create_humans(num_humans): def serialize(humans): - with (open("human.data", "wb") as file): + with open("human.data", "wb") as file: pickle.dump(humans, file) def deserialize(): - with (open("human.data", "rb") as file): + with open("human.data", "rb") as file: humans = pickle.load(file) for human in humans: print(human.name, human.surname, human.age, human.address) diff --git a/Practice/nskorokhodova/Practice_lec_9_task1.py b/Practice/nskorokhodova/Practice_lec_9_task1.py index 87830cf5..f313c385 100644 --- a/Practice/nskorokhodova/Practice_lec_9_task1.py +++ b/Practice/nskorokhodova/Practice_lec_9_task1.py @@ -15,3 +15,19 @@ def __next__(self): paragraph = self.paragraphs[self.current_paragraph] self.current_paragraph += 1 return paragraph.strip() + +# а если вообще через функцию это реализовать, а не через класс? это будет правильно? +def paragraph_iterator(text, paragraph_symbol): + paragraphs = text.split(paragraph_symbol) + + for paragraph in paragraphs: + yield paragraph + + +t = "Текст первого параграфа.Текст второго параграфа.Текст третьего параграфа." +symbol = "." + +iterator = paragraph_iterator(t, symbol) + +for paragraph in iterator: + print(paragraph) diff --git a/Practice/nskorokhodova/Practice_mod_12_task1.py b/Practice/nskorokhodova/Practice_mod_12_task1.py new file mode 100644 index 00000000..e546b72c --- /dev/null +++ b/Practice/nskorokhodova/Practice_mod_12_task1.py @@ -0,0 +1,70 @@ +import math + +def is_prime(num): + if num < 2: + return False + for i in range(2, int(math.sqrt(num)) + 1): + if num % i == 0: + return False + return True + +def find_primes(end, start=3): + primes = [] + for num in range(start, end + 1): + if is_prime(num): + primes.append(num) + return primes + +import time + +# Последовательное выполнение +start_time = time.time() +primes1 = find_primes(10000) +print(f"Время выполнения первого диапазона: {time.time() - start_time} сек") + +start_time = time.time() +primes2 = find_primes(20000, 10001) +print(f"Время выполнения второго диапазона: {time.time() - start_time} сек") + +start_time = time.time() +primes3 = find_primes(30000, 20001) +print(f"Время выполнения третьего диапазона: {time.time() - start_time} сек") + +import threading + +t1 = threading.Thread(target=find_primes, args=(10000,)) +t2 = threading.Thread(target=find_primes, args=(20000, 10001,)) +t3 = threading.Thread(target=find_primes, args=(30000, 20001,)) + +start_time = time.time() +t1.start() +t2.start() +t3.start() +print("Потоки запущены") + +# Если 'забыть' выполнить start или join для потоков, они так и останутся в состоянии запуска +# и не приведут к результату. В этом случае программа может зависнуть, так как главный поток +# не будет дожидаться завершения дочерних потоков и может завершиться раньше их завершения. + +import multiprocessing + +# Многопроцессное выполнение +p1 = multiprocessing.Process(target=find_primes, args=(10000,)) +p2 = multiprocessing.Process(target=find_primes, args=(20000, 10001,)) +p3 = multiprocessing.Process(target=find_primes, args=(30000, 20001,)) + +start_time = time.time() +p1.start() +p2.start() +p3.start() +print("Процессы запущены") + +# Если 'забыть' выполнить start или join для процессов, они так и останутся в состоянии запуска +# и не приведут к результату. Однако, в отличие от потоков, процессы работают независимо друг от +# друга, поэтому главный процесс может продолжить выполняться и завершиться, не дожидаясь завершения +# дочерних процессов. В этом случае дочерние процессы будут продолжать работать независимо до +# своего завершения. + +start_time = time.time() +# Выполнение функции или запуск потоков/процессов +print(f"Время выполнения: {time.time() - start_time} сек") \ No newline at end of file From ea386fa49b8a35de1d136ef31e93ac04c9ce268c Mon Sep 17 00:00:00 2001 From: nsa Date: Fri, 17 Nov 2023 18:11:01 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=94.=D0=B7.=20=D0=BF=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=2012=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_mod_12_task1.py | 96 ++++++++++--------- 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/Practice/nskorokhodova/Practice_mod_12_task1.py b/Practice/nskorokhodova/Practice_mod_12_task1.py index e546b72c..15e02898 100644 --- a/Practice/nskorokhodova/Practice_mod_12_task1.py +++ b/Practice/nskorokhodova/Practice_mod_12_task1.py @@ -1,4 +1,8 @@ import math +import time +import threading +import multiprocessing + def is_prime(num): if num < 2: @@ -8,6 +12,7 @@ def is_prime(num): return False return True + def find_primes(end, start=3): primes = [] for num in range(start, end + 1): @@ -15,56 +20,59 @@ def find_primes(end, start=3): primes.append(num) return primes -import time -# Последовательное выполнение -start_time = time.time() -primes1 = find_primes(10000) -print(f"Время выполнения первого диапазона: {time.time() - start_time} сек") +if __name__ == '__main__': -start_time = time.time() -primes2 = find_primes(20000, 10001) -print(f"Время выполнения второго диапазона: {time.time() - start_time} сек") + start_time = time.time() + primes1 = find_primes(10000) + print(f"Время выполнения первого диапазона: {time.time() - start_time} сек") -start_time = time.time() -primes3 = find_primes(30000, 20001) -print(f"Время выполнения третьего диапазона: {time.time() - start_time} сек") + start_time = time.time() + primes2 = find_primes(20000, 10001) + print(f"Время выполнения второго диапазона: {time.time() - start_time} сек") -import threading + start_time = time.time() + primes3 = find_primes(30000, 20001) + print(f"Время выполнения третьего диапазона: {time.time() - start_time} сек") -t1 = threading.Thread(target=find_primes, args=(10000,)) -t2 = threading.Thread(target=find_primes, args=(20000, 10001,)) -t3 = threading.Thread(target=find_primes, args=(30000, 20001,)) + t1 = threading.Thread(target=find_primes, args=(10000,)) + t2 = threading.Thread(target=find_primes, args=(20000, 10001,)) + t3 = threading.Thread(target=find_primes, args=(30000, 20001,)) -start_time = time.time() -t1.start() -t2.start() -t3.start() -print("Потоки запущены") + start_time = time.time() + t1.start() + t2.start() + t3.start() + print("Потоки запущены") -# Если 'забыть' выполнить start или join для потоков, они так и останутся в состоянии запуска -# и не приведут к результату. В этом случае программа может зависнуть, так как главный поток -# не будет дожидаться завершения дочерних потоков и может завершиться раньше их завершения. + start = time.perf_counter() + threads = [] + for args in ((10000, 3), (20000, 10001), (30000, 20001)): + thr = threading.Thread(target=find_primes, args=args) + thr.start() + threads.append(thr) + for j in threads: + j.join() -import multiprocessing + print(f'Общее время вычислений потоков в секундах: {time.perf_counter() - start}\n') + + p1 = multiprocessing.Process(target=find_primes, args=(10000,)) + p2 = multiprocessing.Process(target=find_primes, args=(20000, 10001,)) + p3 = multiprocessing.Process(target=find_primes, args=(30000, 20001,)) + + start_time = time.time() + p1.start() + p2.start() + p3.start() + print("Процессы запущены") + + start = time.perf_counter() + proc = [] + for args_proc in ((10000, 3), (20000, 10001), (30000, 20001)): + p = multiprocessing.Process(target=find_primes, args=args_proc) + p.start() + proc.append(p) + for pr in proc: + pr.join() -# Многопроцессное выполнение -p1 = multiprocessing.Process(target=find_primes, args=(10000,)) -p2 = multiprocessing.Process(target=find_primes, args=(20000, 10001,)) -p3 = multiprocessing.Process(target=find_primes, args=(30000, 20001,)) - -start_time = time.time() -p1.start() -p2.start() -p3.start() -print("Процессы запущены") - -# Если 'забыть' выполнить start или join для процессов, они так и останутся в состоянии запуска -# и не приведут к результату. Однако, в отличие от потоков, процессы работают независимо друг от -# друга, поэтому главный процесс может продолжить выполняться и завершиться, не дожидаясь завершения -# дочерних процессов. В этом случае дочерние процессы будут продолжать работать независимо до -# своего завершения. - -start_time = time.time() -# Выполнение функции или запуск потоков/процессов -print(f"Время выполнения: {time.time() - start_time} сек") \ No newline at end of file + print(f'Общее время вычислений процессов в секундах: {time.perf_counter() - start}\n') From 21dc8c908627be293cafbf5b084ac42e6b653f47 Mon Sep 17 00:00:00 2001 From: nsa Date: Fri, 17 Nov 2023 19:23:30 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=D0=B51=20=D0=BB=D0=B5=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_lec_9_task1.py | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/Practice/nskorokhodova/Practice_lec_9_task1.py b/Practice/nskorokhodova/Practice_lec_9_task1.py index f313c385..ab54dbe8 100644 --- a/Practice/nskorokhodova/Practice_lec_9_task1.py +++ b/Practice/nskorokhodova/Practice_lec_9_task1.py @@ -1,33 +1,30 @@ class ParagraphIterator: - def __init__(self, text, paragraph_symbol): + def __init__(self, text, paragraph_separator): self.text = text - self.paragraph_symbol = paragraph_symbol - self.paragraphs = text.split(paragraph_symbol) - self.current_paragraph = 0 + self.paragraph_separator = paragraph_separator + self.paragraphs = self.text.split(self.paragraph_separator) + self.index = 0 def __iter__(self): return self def __next__(self): - if self.current_paragraph >= len(self.paragraphs): + if self.index >= len(self.paragraphs): raise StopIteration + else: + paragraph = self.paragraphs[self.index] + self.index += 1 + return paragraph - paragraph = self.paragraphs[self.current_paragraph] - self.current_paragraph += 1 - return paragraph.strip() -# а если вообще через функцию это реализовать, а не через класс? это будет правильно? -def paragraph_iterator(text, paragraph_symbol): - paragraphs = text.split(paragraph_symbol) +text = """ +В лесу родилась елочка. В лесу она росла. +Зимой и летом стройная. +Зеленая была. +""" - for paragraph in paragraphs: - yield paragraph +paragraph_separator = '.' +paragraphs = ParagraphIterator(text, paragraph_separator) - -t = "Текст первого параграфа.Текст второго параграфа.Текст третьего параграфа." -symbol = "." - -iterator = paragraph_iterator(t, symbol) - -for paragraph in iterator: - print(paragraph) +for paragraph in paragraphs: + print(paragraph) \ No newline at end of file From b00a5b82c1557fbcd7fc731b72fc99bfc08b542d Mon Sep 17 00:00:00 2001 From: nsa Date: Fri, 17 Nov 2023 20:04:28 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=94=D0=97=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=2013,=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Practice_mod13_task1_client.py | 24 +++++++++ .../Practice_mod13_task1_server.py | 52 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 Practice/nskorokhodova/Practice_mod13_task1_client.py create mode 100644 Practice/nskorokhodova/Practice_mod13_task1_server.py diff --git a/Practice/nskorokhodova/Practice_mod13_task1_client.py b/Practice/nskorokhodova/Practice_mod13_task1_client.py new file mode 100644 index 00000000..5c45c670 --- /dev/null +++ b/Practice/nskorokhodova/Practice_mod13_task1_client.py @@ -0,0 +1,24 @@ +import socket +import pickle + +def send_data(data): + host = 'mynet' + port = 13579 + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((host, port)) + + send_data = pickle.dumps(data) + s.sendall(send_data) + + recv_data = s.recv(1024) + + decoded_data = pickle.loads(recv_data) + + return decoded_data + + +if __name__ == "__main__": + encrypted_words = ['par**', 'is***bul', 'Li**on', 'lon**n'] + decrypted_words = send_data(encrypted_words) + print(decrypted_words) \ No newline at end of file diff --git a/Practice/nskorokhodova/Practice_mod13_task1_server.py b/Practice/nskorokhodova/Practice_mod13_task1_server.py new file mode 100644 index 00000000..a47b44bf --- /dev/null +++ b/Practice/nskorokhodova/Practice_mod13_task1_server.py @@ -0,0 +1,52 @@ +import socket +import pickle + +def decrypt_words(encrypted_words): + dictionary = { + 'par**': 'Paris', + 'is***bul': 'Istanbul', + 'Li**on': 'Lisbon', + 'lon**n': 'London' + } + decrypted_words = [] + + for word in encrypted_words: + decrypted_word = dictionary.get(word) + decrypted_words.append(decrypted_word) + + return decrypted_words + + +def handle_client(conn): + recv_data = conn.recv(1024) + + encrypted_words = pickle.loads(recv_data) + + decrypted_words = decrypt_words(encrypted_words) + + send_data = pickle.dumps(decrypted_words) + + conn.sendall(send_data) + + conn.close() + + +def start_server(): + host = 'mynet' + port = 13579 + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind((host, port)) + s.listen() + + print("Server started.") + + while True: + conn, addr = s.accept() + print(f"Client connected: {addr}") + + handle_client(conn) + + +if __name__ == "__main__": + start_server() \ No newline at end of file From 0502f829b2a8bd0b2f8db6a4d5da8ff977f1e55c Mon Sep 17 00:00:00 2001 From: nsa Date: Fri, 17 Nov 2023 20:26:07 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D0=94=D0=97=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=2015=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BE=D1=80=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_modul15_task1.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Practice/nskorokhodova/Practice_modul15_task1.py diff --git a/Practice/nskorokhodova/Practice_modul15_task1.py b/Practice/nskorokhodova/Practice_modul15_task1.py new file mode 100644 index 00000000..8443c51c --- /dev/null +++ b/Practice/nskorokhodova/Practice_modul15_task1.py @@ -0,0 +1,19 @@ +Привести два примера предметной области, для представления которых лучше использовать NoSQL-подход. +Аргументировать ответ, используя критерии выбора между SQL и NoSQL. + + +1. Социальные сети. +Социальные сети характеризуются большим объемом данных, высокой скоростью их прихода и изменения, +а также необходимостью горизонтального масштабирования. +В такой предметной области лучше использовать NoSQL-подход, так как он позволяет эффективно +обрабатывать и хранить большие объемы данных с использованием горизонтального масштабирования. +NoSQL базы данных обеспечивают отказоустойчивость и высокую производительность, +что очень важно для социальных сетей с миллионами пользователей. +2. Маркетплэйс ( типа Ozon, Wildberries и т.д.) +Здесь требуется высокая скорость, т.к. может поступать много запросов, нужно +делать много изменений ( добавлять/удалять поставщиков, товары и т.д.), +поэтому лучше использовать NoSQL. +Но в то же время много различных взаимосвязей товары - цены, покупатели - заказы, +покупатели - статус заказа и т.д. и большое количество потенциальных запросов +( поиск товаров, поиск продавца и т.д.) - решает более эффективно SQL. +В целом, более предпочтительно использовать метод NoSQL. From 19feb188dbb22c48a5cf0da138280640c5d5dd9e Mon Sep 17 00:00:00 2001 From: nsa Date: Sat, 18 Nov 2023 00:42:01 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=2012=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Practice/nskorokhodova/Practice_mod_12_task1.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Practice/nskorokhodova/Practice_mod_12_task1.py b/Practice/nskorokhodova/Practice_mod_12_task1.py index 15e02898..3c916c7b 100644 --- a/Practice/nskorokhodova/Practice_mod_12_task1.py +++ b/Practice/nskorokhodova/Practice_mod_12_task1.py @@ -22,19 +22,6 @@ def find_primes(end, start=3): if __name__ == '__main__': - - start_time = time.time() - primes1 = find_primes(10000) - print(f"Время выполнения первого диапазона: {time.time() - start_time} сек") - - start_time = time.time() - primes2 = find_primes(20000, 10001) - print(f"Время выполнения второго диапазона: {time.time() - start_time} сек") - - start_time = time.time() - primes3 = find_primes(30000, 20001) - print(f"Время выполнения третьего диапазона: {time.time() - start_time} сек") - t1 = threading.Thread(target=find_primes, args=(10000,)) t2 = threading.Thread(target=find_primes, args=(20000, 10001,)) t3 = threading.Thread(target=find_primes, args=(30000, 20001,)) From 6ce9e9529eb0d881e65a52b447c641124b36e7e9 Mon Sep 17 00:00:00 2001 From: nsa Date: Sat, 18 Nov 2023 17:30:52 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=2015=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nskorokhodova/Practice_modul15_task1.py | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Practice/nskorokhodova/Practice_modul15_task1.py b/Practice/nskorokhodova/Practice_modul15_task1.py index 8443c51c..a6cfd011 100644 --- a/Practice/nskorokhodova/Practice_modul15_task1.py +++ b/Practice/nskorokhodova/Practice_modul15_task1.py @@ -2,6 +2,26 @@ Аргументировать ответ, используя критерии выбора между SQL и NoSQL. +______________________________________________________________________________________________________________ +База данных SQL – это реляционная база данных который организует данные в таблицы со строками и столбцами. SQL означает язык структурированных запросов, который является стандартным языком, используемым для запроса и управления данными в реляционной базе данных. + +Некоторые ключевые характеристики базы данных SQL включают в себя: + +Данные хранятся в таблицах, содержащих строки и столбцы. Каждая строка представляет запись, а каждый столбец представляет атрибут этой записи. +Между таблицами существуют связи, которые обеспечиваются с помощью внешних ключей. Это обеспечивает целостность данных и уменьшает избыточность. +Язык SQL используется для запроса данных и управления ими. SQL предоставляет такие команды, как SELECT, INSERT, UPDATE и DELETE, для взаимодействия с базой данных. +Свойства ACID (атомарность, согласованность, изоляция, долговечность) применяются для обеспечения надежности и целостности данных. Транзакции либо завершаются полностью, либо не завершаются вообще. + +База данных NoSQL — это нереляционная база данных который хранит данные в формате, отличном от строк и столбцов. Базы данных NoSQL бывают разных типов в зависимости от модели данных. Основные типы: + +Хранилища «ключ-значение». Данные хранятся в неструктурированном формате с уникальным ключом для извлечения значений. (Redis). +Базы данных документов: данные хранятся в формате документа, например JSON. (MongoDB). +Базы данных графов. Данные хранятся в узлах и ребрах, оптимизированных для взаимоотношений между данными.(Neo4j и JanusGraph). +Столбчатые базы данных: данные хранятся в столбцах, а не в строках.(Cassandra). + + +________________________________________________________________________________________________________________________- + 1. Социальные сети. Социальные сети характеризуются большим объемом данных, высокой скоростью их прихода и изменения, а также необходимостью горизонтального масштабирования. @@ -9,6 +29,12 @@ обрабатывать и хранить большие объемы данных с использованием горизонтального масштабирования. NoSQL базы данных обеспечивают отказоустойчивость и высокую производительность, что очень важно для социальных сетей с миллионами пользователей. +Реляционность данных - это количество взаимосвязей между данными.Если предметную область можно представить в виде нескольких отдельных словарей - то реляционность слабая. В случае социальных сетей основная информация - это пользователь и его данные. Т.е. у нас получается, один большой список пользователей, и у каждого пользователя - набор атрибутов (имя, аватар, статус и т.д.). +Пользовательские запросы, в основном, будут такие: найти пользователя по id (это когда мы страничку пользователя открываем), искать пользователей по каким-то другим критериям. Аналогично - для списка музыки, списка видео и т.д. +Важный момент: сами медиа-файлы обычно хранятся отдельно на диске (как обычные файлы, либо в спец. хранилище, типа Amazon S3); в базу данных (что SQL, что NoSQL) их тащить не надо; в базе данных хранятся только пути к этим файлам в виде обычных строк. +Поэтому критерии реляционности и пользовательских запросов также говорят в пользу NoSQL: данные нереляционные, пользовательские запросы простые. + + 2. Маркетплэйс ( типа Ozon, Wildberries и т.д.) Здесь требуется высокая скорость, т.к. может поступать много запросов, нужно делать много изменений ( добавлять/удалять поставщиков, товары и т.д.), @@ -16,4 +42,9 @@ Но в то же время много различных взаимосвязей товары - цены, покупатели - заказы, покупатели - статус заказа и т.д. и большое количество потенциальных запросов ( поиск товаров, поиск продавца и т.д.) - решает более эффективно SQL. -В целом, более предпочтительно использовать метод NoSQL. +SQL-базы данных обычно используют реляционную модель, где данные хранятся в таблицах, связанных с друг другом. Данные в таблицах структурированы по строгим правилам и могут быть связаны с помощью внешних ключей. Эта структура данных делает SQL-базы данных хорошо подходящими для хранения и обработки структурированных данных. Однако эта модель не подходит для хранения неструктурированных данных, таких как изображения, звуковые файлы, видеоматериалы и т. д. +Медиа-файлы обычно хранятся отдельно на диске, в базе данных они представлены обычными строками, в которых хранятся пути к этим файлам. +В случае маркетплейсов данные вроде бы имеют множество взаимосвязей: товары с продавцами, товары с категориями и т.д. Но пользовательские запросы к маркетплейсу, на самом деле, весьма однообразны: нужен список товаров, отфильтрованных по какому-либо признаку. Получается, что нам для хранения данных достаточно большой коллекции документов (товаров), где у каждого документа будет ряд атрибутов (например, категория, цвет, размер, продавец и т.д.). Выносить по правилам реляционных СУБД связи, например, товара и продавца необязательно (тем более конкретный товар всегда жестко привязан к конкретному продавцу). А значит, и объединения таблиц (да и сами таблицы) не требуются. На самом деле, вид, в котором товары отображаются в поисковике маркетплейса, почти повторяет тот вид, в котором они хранятся в его БД. +Анализ по критериям реляционности и потенциальных запросов обычно выполняется совместно и зачастую сводится к ответу на вопрос: можно ли представить сущности этой предметной области в виде нескольких отдельных словарей. +Исходя из этого я сделала вывод, что в случае с маркетплэйсами все таки лучше использовать NoSQL. +