diff --git a/Practice/Kisunkina/__init__.py b/Practice/Kisunkina/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 13/homework 13.1.py b/Practice/Kisunkina/lec 13/homework 13.1.py
new file mode 100644
index 0000000..a400661
--- /dev/null
+++ b/Practice/Kisunkina/lec 13/homework 13.1.py
@@ -0,0 +1,14 @@
+# Привести два примера предметной области, для представления которых лучше использовать
+# NoSQL-подход. Аргументировать ответ, используя критерии выбора между SQL и NoSQL.
+
+1) В моей голове возник пример с Википедией:
++ масштабируемое хранилище информации
++ прозрачность внесения изменений (добавление новых узлов и связей или их удаление)
+
+2) Веб - аналитика:
++ обеспечение быстрого доступа к данным
++ хранение больших объемов агрегированных даннх
+
+3) социальные сети:
++ иммет сложные отношения между объектами, несмотря на это идёт легкий поик по базе данных
++ требуемая скорость работы и обработки внесенной информации
\ No newline at end of file
diff --git a/Practice/Kisunkina/lec 14/homework_14.py b/Practice/Kisunkina/lec 14/homework_14.py
new file mode 100644
index 0000000..c8a41f9
--- /dev/null
+++ b/Practice/Kisunkina/lec 14/homework_14.py
@@ -0,0 +1,29 @@
+# Написать функцию to_roman, которая принимает целое число, а возвращает строку,
+# отображающую это число римскими цифрами. Например, на вход подается 6, возвращается - "VI";
+# на вход подается 23, возвращается "XXIII". Входные данные должны быть в диапазоне от 1 до 5000,
+# если подается число не из этого диапазона, или не число, то должны выбрасываться ошибка типа
+# NonValidInput. Этот тип ошибки надо создать отдельно. Также необходимо в папке с файлом,
+# содержащим вашу функцию, создать файл tests.py, внутри которой необходимо определить тесты для
+# вашей функции. Тесты должны покрывать все возможное поведение функции, включая порождения ошибки
+# при некорректных входных данных.
+
+class Error(Exception):
+ pass
+
+class RomanNumber:
+ __roman_numbers = {'M': 1000, 'CM': 900, 'D': 500, 'CD': 400,
+ 'C': 100, 'XC': 90, 'L': 50, 'XL': 40,
+ 'X': 10, 'IX': 9, 'V': 5, 'IV': 4, 'I': 1}
+ max_number = 5000
+
+ def to_roman(self, number):
+ roman = ""
+ if isinstance(number, int):
+ if 1 <= number <= self.max_number:
+ for key, value in self.__roman_numbers.items():
+ while number >= value:
+ roman += key
+ number -= value
+ return roman
+ raise Error("NonValidInput")
+
diff --git a/Practice/Kisunkina/lec 14/test.py b/Practice/Kisunkina/lec 14/test.py
new file mode 100644
index 0000000..2d8978f
--- /dev/null
+++ b/Practice/Kisunkina/lec 14/test.py
@@ -0,0 +1,16 @@
+import pytest
+from homework_14 import RomanNumber
+from homework_14 import Error
+
+
+class TestMyProv:
+ _test_roman = RomanNumber()
+
+ @pytest.mark.parametrize("number, roman_number", [(9, "IX"), (1050, "ML")])
+ def test_to_roman(self, number, roman_number):
+ assert self._test_roman.to_roman(number) == roman_number
+
+ @pytest.mark.parametrize("number", ['3459', 5521, -2])
+ def test_my_error1(self, number):
+ with pytest.raises(Error):
+ self._test_roman.to_roman(number)
diff --git a/Practice/Kisunkina/lec 15/__init__.py b/Practice/Kisunkina/lec 15/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolapp/__init__.py b/Practice/Kisunkina/lec 15/coolapp/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolapp/admin.py b/Practice/Kisunkina/lec 15/coolapp/admin.py
new file mode 100644
index 0000000..8c8b282
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/admin.py
@@ -0,0 +1,8 @@
+
+
+# Register your models here.
+
+from django.contrib import admin
+from .models import Film
+
+admin.site.register(Film)
diff --git a/Practice/Kisunkina/lec 15/coolapp/apps.py b/Practice/Kisunkina/lec 15/coolapp/apps.py
new file mode 100644
index 0000000..a37f808
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class CoolappConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'coolapp'
diff --git a/Practice/Kisunkina/lec 15/coolapp/foto/111.jpeg b/Practice/Kisunkina/lec 15/coolapp/foto/111.jpeg
new file mode 100644
index 0000000..dafaf1b
Binary files /dev/null and b/Practice/Kisunkina/lec 15/coolapp/foto/111.jpeg differ
diff --git a/Practice/Kisunkina/lec 15/coolapp/migrations/0001_initial.py b/Practice/Kisunkina/lec 15/coolapp/migrations/0001_initial.py
new file mode 100644
index 0000000..d24d36d
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/migrations/0001_initial.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.2.4 on 2023-08-12 13:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Film',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200)),
+ ('desc', models.TextField()),
+ ('pub_date', models.DateTimeField(auto_now_add=True, verbose_name='date published')),
+ ],
+ ),
+ ]
diff --git a/Practice/Kisunkina/lec 15/coolapp/migrations/0002_film_rate.py b/Practice/Kisunkina/lec 15/coolapp/migrations/0002_film_rate.py
new file mode 100644
index 0000000..58609fd
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/migrations/0002_film_rate.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.2.4 on 2023-08-12 13:53
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('coolapp', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='film',
+ name='rate',
+ field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10)]),
+ ),
+ ]
diff --git a/Practice/Kisunkina/lec 15/coolapp/migrations/__init__.py b/Practice/Kisunkina/lec 15/coolapp/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolapp/models.py b/Practice/Kisunkina/lec 15/coolapp/models.py
new file mode 100644
index 0000000..e256a86
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/models.py
@@ -0,0 +1,8 @@
+from django.db import models
+from django.core.validators import MaxValueValidator, MinValueValidator
+
+class Film(models.Model):
+ name = models.CharField(max_length=200)
+ desc = models.TextField()
+ pub_date = models.DateTimeField('date published', auto_now_add=True)
+ rate = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(10)], default=1)
diff --git a/Practice/Kisunkina/lec 15/coolapp/static/css/main.css b/Practice/Kisunkina/lec 15/coolapp/static/css/main.css
new file mode 100644
index 0000000..b199695
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/static/css/main.css
@@ -0,0 +1,3 @@
+body {
+ background-color: #f6e4fa; /* Цвет фона */
+}
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/__init__.py b/Practice/Kisunkina/lec 15/coolapp/templates/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/111.jpeg b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/111.jpeg
new file mode 100644
index 0000000..dafaf1b
Binary files /dev/null and b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/111.jpeg differ
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/__init__.py b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/base.html b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/base.html
new file mode 100644
index 0000000..551c85b
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/base.html
@@ -0,0 +1,15 @@
+{% load static %}
+
+
+
+
+
+
+ About films
+
+
+
+ {% block content %}
+ {% endblock %}
+
+
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/films.html b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/films.html
new file mode 100644
index 0000000..720f951
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/films.html
@@ -0,0 +1,16 @@
+{% extends 'coolapp/base.html' %}
+{% block content %}
+
+
+{% for film in films %}
+ {{ film.name }}
+ {{ film.desc }}
+{% if film.pub_date %}
+ Film date - {{ film.pub_date }}!
+{% else %}
+ Film date - Unknown!
+{% endif %}
+ {{ film.rate }}
+{% endfor %}
+
+{% endblock content %}
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/forms.py b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/forms.py
new file mode 100644
index 0000000..d3b7c63
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/forms.py
@@ -0,0 +1,8 @@
+from django import forms
+from coolapp.models import Film
+
+class FilmForm(forms.ModelForm):
+ class Meta:
+ model = Film
+ fields = ('name', 'desc', 'rate')
+# поля pub_date и id заполняются сами
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/index.html b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/index.html
new file mode 100644
index 0000000..77ff97a
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/index.html
@@ -0,0 +1,18 @@
+{% extends 'coolapp/base.html' %}
+{% block content %}
+
+
+
+
+
+ Title
+
+
+Привет, ты находишься на сайте {{ sitename }}
+Эта страница посвящена нескольким фильмам!
+Приятного просмотра!
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/new.html b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/new.html
new file mode 100644
index 0000000..f858bd6
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/templates/coolapp/new.html
@@ -0,0 +1,9 @@
+{% extends 'coolapp/base.html' %}
+{% block content %}
+
+New film
+
+
+{% endblock content %}
diff --git a/Practice/Kisunkina/lec 15/coolapp/tests.py b/Practice/Kisunkina/lec 15/coolapp/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Practice/Kisunkina/lec 15/coolapp/urls.py b/Practice/Kisunkina/lec 15/coolapp/urls.py
new file mode 100644
index 0000000..552ff09
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/urls.py
@@ -0,0 +1,10 @@
+from django.urls import path
+from . import views
+
+
+urlpatterns = [
+ path('', views.index, name='index'),
+ path('new/', views.new, name='new'),
+ path('films/', views.films, name='films'),
+ path('/', views.new, name='new'),
+]
diff --git a/Practice/Kisunkina/lec 15/coolapp/views.py b/Practice/Kisunkina/lec 15/coolapp/views.py
new file mode 100644
index 0000000..908eab6
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolapp/views.py
@@ -0,0 +1,43 @@
+
+
+# Create your views here.
+
+from django.http import HttpResponse
+
+from django.shortcuts import render
+from .models import Film
+from .templates.coolapp.forms import FilmForm
+from django.shortcuts import redirect
+
+
+def index(request):
+ return render(request, 'coolapp/index.html')
+
+def films(request):
+ return render(request, 'coolapp/films.html',
+ {'films': Film.objects.all()})
+
+# def new(request):
+# return render(request, 'coolapp/new.html', {'form': FilmForm()})
+
+def new(request, film_id=None):
+ if request.method == "POST":
+ form = FilmForm(request.POST)
+ if form.is_valid():
+ film = form.save()
+ return redirect(f'/{film.id}', film=film)
+ if film_id:
+ film = Film.objects.get(id=film_id)
+ else:
+ film = Film()
+ return render(request, 'coolapp/new.html',
+ {'form': FilmForm(instance=film)})
+
+def index(request):
+ return render(request, 'coolapp/index.html', {'sitename': 'О хороших фильмах'})
+
+
+
+
+
+
diff --git a/Practice/Kisunkina/lec 15/coolsite/__init__.py b/Practice/Kisunkina/lec 15/coolsite/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Practice/Kisunkina/lec 15/coolsite/asgi.py b/Practice/Kisunkina/lec 15/coolsite/asgi.py
new file mode 100644
index 0000000..169f3fb
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolsite/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for coolsite project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'coolsite.settings')
+
+application = get_asgi_application()
diff --git a/Practice/Kisunkina/lec 15/coolsite/settings.py b/Practice/Kisunkina/lec 15/coolsite/settings.py
new file mode 100644
index 0000000..930050f
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolsite/settings.py
@@ -0,0 +1,125 @@
+"""
+Django settings for coolsite project.
+
+Generated by 'django-admin startproject' using Django 4.2.4.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.2/ref/settings/
+"""
+import os
+from pathlib import Path
+
+# Build paths inside the project like this: BASE_DIR / 'subdir'.
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-w3bvhq_*y3gn&f9*k(6bb9#=9*@ot#g*c=)by1_vvq7bt24w&l'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'coolapp'
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'coolsite.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'coolsite.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/4.2/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'Europe/Moscow'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.2/howto/static-files/
+
+STATIC_URL = '/static/'
+STATIC_ROOT = os.path.join(BASE_DIR, 'static')
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/Practice/Kisunkina/lec 15/coolsite/urls.py b/Practice/Kisunkina/lec 15/coolsite/urls.py
new file mode 100644
index 0000000..dda65b4
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolsite/urls.py
@@ -0,0 +1,29 @@
+"""
+URL configuration for coolsite project.
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.2/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+
+from django.conf.urls import include
+from django.urls import path
+from django.contrib import admin
+
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('coolapp/', include('coolapp.urls')),
+ path('', include('coolapp.urls')),
+ # path('coolapp/', coolapp.views.index, name='index')
+]
+
diff --git a/Practice/Kisunkina/lec 15/coolsite/wsgi.py b/Practice/Kisunkina/lec 15/coolsite/wsgi.py
new file mode 100644
index 0000000..0b68675
--- /dev/null
+++ b/Practice/Kisunkina/lec 15/coolsite/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for coolsite project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'coolsite.settings')
+
+application = get_wsgi_application()
diff --git a/Practice/Kisunkina/lec 7/homework 7.3.py b/Practice/Kisunkina/lec 7/homework 7.3.py
new file mode 100644
index 0000000..3a1db83
--- /dev/null
+++ b/Practice/Kisunkina/lec 7/homework 7.3.py
@@ -0,0 +1,61 @@
+# Реализовать систему, эмулирующую работу с банкоматами. Создать семейство классов банкоматов,
+# хранящих определенные суммы и поддерживающих различные операции (одни банкоматы принимают и выдают
+# наличные, другие позволяют еще и проводить онлайн платежи). Операции реализуются посредством методов,
+# выводящих название операции и меняющих (при необходимости) количество наличных в банкомате. Для
+# тестирования системы необходимо реализовать алгоритм, обходящий список банкоматов разного типа и
+# запрашивающий у каждого банкомата информацию о количестве наличных и наборе поддерживаемых операций.
+
+class ATM:
+ def __init__(self, balance):
+ self.balance = float(balance)
+
+ def about_atm(self):
+ print("Банкомат может выдавать и принимать наличные")
+
+ def give_money(self, money):
+ if self.balance > money:
+ self.balance -= money
+ print(f"На Вашем счету осталось: {self.balance} рублей")
+ else:
+ print("На счете недостаточно средств!")
+
+ def take_money(self, money):
+ self.balance += money
+ print (f"На Вашем счету теперь: {self.balance} рублей")
+
+
+class FirstAtm(ATM):
+ def __init__(self, balance):
+ super().__init__(balance)
+ self.name = "Счёт № 1"
+
+
+class SecondAtm(ATM):
+ def __init__(self, balance):
+ super().__init__(balance)
+ self.name = "Счёт № 2"
+
+ def about_atm(self):
+ super().about_atm()
+ print("Банкомат может осуществлять online платежи")
+
+ def online(self, money):
+ input("Введите номер получателя средств: ")
+ self.give_money(money)
+
+
+
+atm1 = FirstAtm(100000)
+atm2 = SecondAtm(50000)
+
+atm = [atm1, atm2]
+
+for i in atm:
+ print(f"Вы снимаете деньги с {i.name}")
+ money = int(input("Ведите сумму, которую хотите снять: "))
+ i.give_money(money)
+ money = int(input("Ведите сумму, которую хотите положить на счёт: "))
+ i.take_money(money)
+ if isinstance(i, SecondAtm):
+ money = int(input("Ведите сумму, которую хотите перевести: "))
+ i.online(money)
diff --git a/Practice/Kisunkina/lec 8/homework 8.2.py b/Practice/Kisunkina/lec 8/homework 8.2.py
new file mode 100644
index 0000000..e3c7496
--- /dev/null
+++ b/Practice/Kisunkina/lec 8/homework 8.2.py
@@ -0,0 +1,10 @@
+# Написать генератор для построчного чтения файла.
+
+def read_line(name_file):
+ with open(name_file, 'r') as file:
+ for line in file:
+ yield line
+
+name_file = "test.txt"
+for line in read_line(name_file):
+ print(line)
diff --git a/Practice/Kisunkina/lec 8/homework 8.3.py b/Practice/Kisunkina/lec 8/homework 8.3.py
new file mode 100644
index 0000000..c8060f9
--- /dev/null
+++ b/Practice/Kisunkina/lec 8/homework 8.3.py
@@ -0,0 +1,17 @@
+# Напишите свой менеджер контекста, замеряющий и показывающий время исполнения кода внутри него.
+
+import time
+
+class Timer:
+ def __enter__(self):
+ self.start_time = time.time()
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ end_time = time.time()
+ print(f"Время исполнения кода: {end_time - self.start_time} секунд")
+
+
+with Timer():
+ lst = range(1, 1000000)
+ for i in lst:
+ i +=1
diff --git a/Practice/Kisunkina/lec 8/homework 8.4.py b/Practice/Kisunkina/lec 8/homework 8.4.py
new file mode 100644
index 0000000..e5ee422
--- /dev/null
+++ b/Practice/Kisunkina/lec 8/homework 8.4.py
@@ -0,0 +1,30 @@
+# Часто задача программиста заключается в том, чтоб найти в документации готовую функцию,
+# которая реализует необходимое решение. Данное задание предполагает самостоятельное изучение
+# документации к библиотеке itertools (это набор готовых итераторов), чтобы подобрать те функции,
+# которые дадут правильные ответы на указанные вопросы (иногда надо будет добавить свои аргументы
+# при вызове функций помимо тех, что указаны в задании). Требуется написать код, который использует
+# указанные входные данные и выводит на экран возвращаемое значение. Помните, что функции могут
+# возвращать генератор, который нужно "развернуть" для вывода на экран.
+import itertools
+# Функция должна принимать три массива ([1, 2, 3], [4, 5], [6, 7]), а вернуть лишь один
+# # массив ([1, 2, 3, 4, 5, 6, 7])
+
+from itertools import chain
+
+lst = ([1, 2, 3], [4, 5], [6, 7])
+res = list(chain.from_iterable(lst))
+print(res)
+
+# Функция принимает массив (['hello', 'i', 'write', 'cool', 'code']) и возвращает массив
+# из элементов, у которых длина не меньше пяти (['hello', 'write’])
+
+lst2 = ['hello', 'i', 'write', 'cool', 'code']
+res2 = list(itertools.filterfalse(lambda x: len(x) < 5, lst2))
+print(res2)
+
+# Функция выдает на строку 'password' все возможные комбинации
+# вида ([('p', 'a', 's', 's'), ('p', 'a', 's', 'w'), ('p', 'a', 's', 'o'), ...)
+
+lst3 = "password"
+res3 = list(itertools.combinations(lst3, 4))
+print(res3)
diff --git a/Practice/Kisunkina/lec 8/test.txt b/Practice/Kisunkina/lec 8/test.txt
new file mode 100644
index 0000000..78fa751
--- /dev/null
+++ b/Practice/Kisunkina/lec 8/test.txt
@@ -0,0 +1,8 @@
+ Мыльный пузырь отделился от соломинки и важно поплыл через открытое окно в сад.
+ Все жители сада оторвались от своих важных дел и уставились на это радужное переливающееся чудо.
+ - Кто ты, как сюда попал? - интересовались птички, жуки, бабочки, кузнечики.
+ - Я прилетел к вам из своего соломенного дворца. Я - очень важная персона.
+ Все вокруг стали нахваливать его за красоту, изысканную одежду, прекрасные манеры.
+ А пузырь только раздувался от важности. И в конце концов - лопнул.
+ Только мокрое место от него осталось.
+ - Он был красивым только снаружи, - догадалась бабочка, - а внутри он оказался пустым и не таким уж важным.
\ No newline at end of file