Python | Вопросы собесов
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky
Больше📈 Аналитический обзор Telegram-канала Python | Вопросы собесов
Канал Python | Вопросы собесов (@python_easy_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 13 110 подписчиков, занимая 9 732 место в категории Технологии и приложения и 50 668 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 13 110 подписчиков.
Согласно последним данным от 05 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -48, а за последние 24 часа — -5, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 6.21%. В первые 24 часа после публикации контент обычно набирает 6.02% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 814 просмотров. В течение первых суток публикация набирает 789 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, модуль, строка, docker, alice.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp
Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky”
Благодаря высокой частоте обновлений (последние данные получены 07 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знанийCache-Control — основной заголовок для кэширования, который указывает, как долго хранить ресурс и когда обновлять его.
Cache-Control: no-cache # Браузер всегда запрашивает ресурс заново
Cache-Control: no-store # Запрещает кэширование вообще
Cache-Control: public, max-age=3600 # Кэшировать 1 час (3600 секунд)
Cache-Control: private, max-age=600 # Кэш только для одного пользователя (например, личный кабинет)
Cache-Control: must-revalidate # Клиент должен проверять, истёк ли срок кэша перед загрузкой
🟠Управление кэшем с `ETag` (оптимизированное обновление)
ETag — это уникальный идентификатор версии файла.
Сервер отправляет ресурс с ETag:
ETag: "abc123"
При следующем запросе браузер отправляет If-None-Match:
If-None-Match: "abc123"
Если ресурс не изменился, сервер отвечает 304 Not Modified (клиент использует кэш).
Если ресурс изменился — сервер отправляет новую версию.
HTTP/1.1 304 Not Modified
🟠Кэширование через `Last-Modified`
Работает аналогично ETag, но вместо идентификатора используется дата последнего изменения.
Сервер отправляет заголовок
Last-Modified: Wed, 21 Feb 2024 10:00:00 GMT
Браузер запрашивает ресурс с If-Modified-Since
If-Modified-Since: Wed, 21 Feb 2024 10:00:00 GMT
🟠Полное отключение кэша
Если нужно всегда загружать свежие данные, используем:
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache # Устарел, но нужен для старых браузеров
Expires: 0
🟠Управление кэшем через `Vary`
Если ресурс зависит от заголовков (User-Agent, Accept-Encoding), используем Vary.
Vary: User-Agent
🟠Принудительное обновление кэша (Cache Busting)
Если сервер отправил старый кэш, можно обновить ресурс с новым URL.
Способы
Добавить версию в URL
/style.css?v=2Использовать хеш в имени файла:
/style.abc123.cssСтавь 👍 и забирай 📚 Базу знаний
Merge Sort) — это алгоритм, который использует разделяй и властвуй (divide & conquer).
В худшем случае сложность O(n log n).
🚩Как работает сортировка слиянием?
🟠Делим массив пополам
до тех пор, пока не останутся отдельные элементы.
🟠Сортируем и сливаем
полученные подмассивы.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
arr = [5, 2, 9, 1, 5, 6]
print(merge_sort(arr))
Ставь 👍 и забирай 📚 Базу знанийGET https://api.example.com/users/123Использование стандартных HTTP-методов: GET — для получения данных. POST — для создания новых данных. PUT или PATCH — для обновления данных. DELETE — для удаления данных. Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате. 🟠Кэширование Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента. 🟠Единообразие и слои RESTful системы могут включать несколько слоев (например, балансировщики нагрузки, кеш-сервисы), но клиент взаимодействует только с сервером, не зная о внутренних слоях. 🟠Код по требованию (опционально) Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно. 🚩Почему RESTful важен? RESTful архитектура позволяет: 🟠Сделать API простым и понятным Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса). 🟠Обеспечить гибкость Клиенты и серверы могут развиваться независимо друг от друга. 🟠Поддерживать масштабируемость RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность). 🟠Облегчить интеграцию RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще. Ставь 👍 и забирай 📚 Базу знаний
abstract = True в Meta.
Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # Указывает, что это абстрактная модель
class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()
class Comment(BaseModel):
text = models.TextField()
🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает OneToOneField на родительскую.
class Person(models.Model):
name = models.CharField(max_length=255)
class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)
🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В Meta указывается proxy = True.
Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)
class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель
def get_uppercase_name(self):
return self.name.upper()
Ставь 👍 и забирай 📚 Базу знанийZeroDivisionError),
обращение к несуществующему индексу (IndexError),
работа с несуществующим файлом (FileNotFoundError) и т. д.
🚩Как это работает?
В Python для обработки исключений используется конструкция try-except.
Обработка деления на ноль
try:
x = 10 / 0 # Ошибка: деление на ноль
except ZeroDivisionError:
print("Ошибка! Деление на ноль невозможно.")
Результат: вместо аварийного завершения программы мы получаем сообщение
Ошибка! Деление на ноль невозможно.Обработка нескольких типов исключений
try:
num = int(input("Введите число: ")) # Возможна ошибка ValueError
result = 10 / num # Возможна ошибка ZeroDivisionError
except ZeroDivisionError:
print("Ошибка! Деление на ноль.")
except ValueError:
print("Ошибка! Введите число.")
Если пользователь введет "abc", программа не завершится с ошибкой, а выведет
Ошибка! Введите число.Использование
finally (код, который выполняется всегда)
try:
file = open("data.txt", "r") # Возможна ошибка FileNotFoundError
content = file.read()
except FileNotFoundError:
print("Файл не найден!")
finally:
print("Программа завершена.") # Выполнится в любом случае
Ставь 👍 и забирай 📚 Базу знанийfilter() — это встроенная функция Python, которая отбирает элементы из последовательности по заданному условию.
filter(function, iterable)
🚩Как работает `filter()`?
Пример 1: Фильтрация чётных чисел
numbers = [1, 2, 3, 4, 5, 6]
# Оставляем только чётные числа
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # [2, 4, 6]
Пример 2: Фильтрация строк по длине
words = ["apple", "kiwi", "banana", "cherry"]
# Оставляем только слова длиной больше 5 символов
long_words = filter(lambda word: len(word) > 5, words)
print(list(long_words)) # ['banana', 'cherry']
Пример 3: Фильтрация None и пустых значений
values = [None, 0, "", "hello", 42, [], {}]
# Оставляем только "истинные" значения
filtered_values = filter(None, values)
print(list(filtered_values)) # ['hello', 42]
Пример 4: Использование filter() с def
def is_positive(n):
return n > 0
numbers = [-5, -2, 0, 3, 7, -1]
positive_numbers = filter(is_positive, numbers)
print(list(positive_numbers)) # [3, 7]
🚩Чем `filter()` лучше `for` + `if`?
Более короткий и читаемый код
# С `filter()`
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# С `for` + `if`
even_numbers = [x for x in numbers if x % 2 == 0]
Ставь 👍 и забирай 📚 Базу знанийUser) и механизме сессий. Когда пользователь входит в систему, Django проверяет его учетные данные и создает сессию, сохраняя в ней идентификатор пользователя.
Процесс можно разделить на несколько шагов:
Пользователь вводит логин и пароль.
Django проверяет данные через аутентификационный бэкенд.
Если данные верны, Django создает сессию.
При каждом запросе Django проверяет, авторизован ли пользователь.
🚩Основные компоненты системы аутентификации
🟠Модель пользователя (`User`)
Django предоставляет встроенную модель пользователя django.contrib.auth.models.User. Она содержит:
username, email, password
is_staff, is_superuser, is_active
date_joined, last_login
from django.contrib.auth.models import User
# Создание пользователя
user = User.objects.create_user(username="admin", password="12345")
user.email = "admin@example.com"
user.save()
# Проверка пароля
print(user.check_password("12345")) # True
🟠Аутентификация (`authenticate`)
Django использует функцию authenticate() для проверки учетных данных.
from django.contrib.auth import authenticate
user = authenticate(username="admin", password="12345")
if user is not None:
print("Успешный вход!")
else:
print("Ошибка аутентификации!")
🟠Вход и выход (`login` / `logout`)
После успешной аутентификации пользователя можно "впустить" с помощью login().
from django.contrib.auth import login, logout
def user_login(request):
user = authenticate(username="admin", password="12345")
if user:
login(request, user) # Создает сессию
return "Пользователь вошел!"
return "Ошибка входа"
def user_logout(request):
logout(request) # Удаляет сессию
return "Пользователь вышел!"
🟠Проверка аутентификации
Во вьюхах можно проверить, авторизован ли пользователь
if request.user.is_authenticated:
print("Пользователь залогинен:", request.user.username)
else:
print("Гость")
Для защиты маршрутов можно использовать декоратор @login_required:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
return "Это страница профиля!"
🚩Настройка аутентификации
🟠Настройки в `settings.py`
Django по умолчанию использует django.contrib.auth.backends.ModelBackend для аутентификации через базу данных. Можно добавить кастомные бэкенды:
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # Обычная аутентификация
]
🟠Изменение модели пользователя
Если стандартной модели User недостаточно, можно создать кастомную модель
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, unique=True)
# В settings.py указываем свою модель
AUTH_USER_MODEL = "myapp.CustomUser"
🟠Разрешения и группы
Django поддерживает группы пользователей и права доступа.
if user.has_perm("app_name.permission_codename"):
print("У пользователя есть разрешение!")
Использование групп
from django.contrib.auth.models import Group
group = Group.objects.create(name="Editors") # Создаем группу
user.groups.add(group) # Добавляем пользователя в группу
Ставь 👍 и забирай 📚 Базу знаний
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
