Python співбесіда: Django, Flask, алгоритми — топ-20 питань у 2026
Найпопулярніші питання на Python-співбесідах з детальними відповідями. Django, Flask, asyncio, алгоритми, бази даних, тестування — все українською.
🐍 Python основи
1. Які основні типи даних є в Python? Чим відрізняється list від tuple?
В Python є мутабельні типи (list, dict, set) та імутабельні (int, float, str, tuple, frozenset). list — змінюваний, можна додавати/видаляти елементи. tuple — незмінюваний, працює швидше і може бути ключем у словнику.
💡 Порада: На співбесіді згадайте, що tuple використовують для незмінних колекцій (координати, конфігурації), а list — коли потрібна динамічна зміна. Покажіть розуміння hashability.
2. Що таке GIL і як він впливає на багатопотоковість?
Global Interpreter Lock (GIL) — механізм CPython, який дозволяє лише одному потоку виконувати Python-байткод одночасно. Це спрощує управління пам'яттю, але обмежує паралельність для CPU-bound задач. Для I/O-bound задач threading все ще ефективний, бо GIL звільняється під час очікування I/O.
💡 Порада: Згадайте альтернативи: multiprocessing для CPU-bound задач, asyncio для I/O-bound, або інтерпретатори без GIL (PyPy, проєкт nogil у Python 3.13+).
3. Поясніть генератори та декоратори в Python
Генератор — функція з yield, яка повертає ітератор і генерує значення лінивим чином (lazy evaluation), економлячи пам'ять. Декоратор — функція, яка приймає іншу функцію і розширює її поведінку без зміни вихідного коду. Використовує паттерн обгортки (wrapper).
💡 Порада: Приклад генератора: читання великого файлу рядок за рядком. Приклад декоратора: @login_required, @cache. Знайте про functools.wraps для збереження метаданих функції.
🏗️ Django
4. Як працює Django ORM? Що таке QuerySet і коли він виконується?
Django ORM — це абстракція над SQL, яка дозволяє працювати з базою через Python-об'єкти. QuerySet — лінивий (lazy) об'єкт: SQL-запит не виконується, поки ви не ітеруєте результат, не викликаєте list(), len() або зріз. Це дозволяє ланцюжкувати фільтри: Model.objects.filter(...).exclude(...).order_by(...).
💡 Порада: Обов'язково згадайте N+1 проблему та рішення: select_related (JOIN) для ForeignKey і prefetch_related (окремий запит) для ManyToMany.
5. Що таке middleware в Django і для чого використовується?
Middleware — це «хуки» між запитом і відповіддю. Кожен middleware обробляє request (перед view) і response (після view). Вбудовані приклади: SecurityMiddleware, SessionMiddleware, CsrfViewMiddleware. Middleware виконуються у порядку, зазначеному в MIDDLEWARE settings.
💡 Порада: Розкажіть, коли писати свій middleware: логування запитів, rate limiting, додавання кастомних заголовків, модифікація request/response.
6. Що таке Django signals і коли їх варто (і не варто) використовувати?
Signals — механізм pub/sub в Django: pre_save, post_save, pre_delete, post_delete тощо. Дозволяють реагувати на події моделей без прямого зв'язку між компонентами. Наприклад, автоматично створити профіль при реєстрації користувача.
💡 Порада: Сигнали ускладнюють дебагінг і створюють неявні залежності. У більшості випадків краще перевизначити метод save() або використати менеджер. Використовуйте signals тільки для розв'язання (decoupling) між різними додатками.
🌶️ Flask
7. Що таке Blueprint у Flask і для чого він потрібен?
Blueprint — спосіб організації Flask-застосунку на модулі. Кожен Blueprint може мати свої routes, templates, static files. Це аналог Django-додатків (apps). Реєструються через app.register_blueprint(bp, url_prefix='/api').
💡 Порада: Покажіть, що розумієте Application Factory Pattern: create_app() → реєстрація blueprints, extensions, конфігурації. Це стандарт для production-ready Flask.
8. Які основні розширення Flask ви використовували?
Найпоширеніші: Flask-SQLAlchemy (ORM), Flask-Migrate (Alembic міграції), Flask-Login (аутентифікація), Flask-WTF (форми + CSRF), Flask-RESTful або Flask-RESTX (REST API), Flask-Caching (кешування), Flask-Mail (email).
💡 Порада: Не просто перелічуйте — розкажіть, в якому проєкті і чому ви обрали конкретне розширення. Порівняйте Flask-SQLAlchemy з чистим SQLAlchemy Core.
9. Як працює Jinja2 у Flask? Що таке контекстні процесори?
Jinja2 — шаблонізатор Flask з підтримкою наслідування шаблонів (extends), блоків (block), макросів, фільтрів. Контекстний процесор (@app.context_processor) — функція, яка додає змінні у всі шаблони автоматично (наприклад, поточний користувач, рік для footer).
💡 Порада: Згадайте автоескейпінг XSS у Jinja2 (за замовчуванням увімкнений), фільтр |safe та кастомні фільтри через app.template_filter().
🧮 Алгоритми та структури даних
10. Що таке Big O нотація? Наведіть приклади складностей
Big O описує верхню межу зростання часу/пам'яті алгоритму. Основні: O(1) — доступ до dict за ключем; O(log n) — бінарний пошук; O(n) — лінійний пошук; O(n log n) — сортування (Timsort у Python); O(n²) — вкладені цикли; O(2ⁿ) — рекурсивний Fibonacci без мемоізації.
💡 Порада: Завжди аналізуйте і часову, і просторову складність. Вмійте пояснити, чому dict lookup — O(1) амортизовано (хеш-таблиця).
11. Як реалізувати стек і чергу в Python?
Стек (LIFO): простий list з append() і pop(). Черга (FIFO): використовуйте collections.deque з append() і popleft() — O(1) для обох операцій. Не використовуйте list.pop(0) — це O(n), бо зсуває всі елементи.
💡 Порада: Для пріоритетних черг — heapq. Для потокобезпечних — queue.Queue. Знання правильних структур для задачі показує досвід.
12. Поясніть різницю між BFS і DFS. Коли використовувати кожен?
BFS (пошук в ширину) — використовує чергу, знаходить найкоротший шлях у невзваженому графі. DFS (пошук в глибину) — використовує стек/рекурсію, ефективний для пошуку шляху, перевірки зв'язності, топологічного сортування. BFS — O(V+E) пам'яті, DFS — O(V) стеку.
💡 Порада: BFS для найкоротшого шляху, рівневого обходу дерева. DFS для пошуку циклів, лабіринтів, backtracking задач. Вмійте реалізувати обидва ітеративно.
🗄️ Бази даних
13. Що таке індекси в PostgreSQL і коли їх створювати?
Індекс — структура даних (B-tree за замовчуванням), яка прискорює пошук. Створюйте для стовпців у WHERE, JOIN, ORDER BY. PostgreSQL також має GIN (повнотекстовий пошук, JSONB), GiST (геодані), BRIN (великі таблиці з послідовними даними).
💡 Порада: Індекси уповільнюють INSERT/UPDATE. Використовуйте EXPLAIN ANALYZE для перевірки. Знайте про часткові індекси (WHERE active = true) та покривні індекси (INCLUDE).
14. Для чого використовують Redis у Python-проєктах?
Redis — in-memory key-value сховище. Основні кейси: кешування (Django cache backend, Flask-Caching), сесії, черги задач (Celery broker), rate limiting, pub/sub для реального часу, лічильники та лідерборди (sorted sets).
💡 Порада: Знайте типи даних Redis: strings, hashes, lists, sets, sorted sets. Розкажіть про TTL для кешу та стратегії eviction (LRU, LFU). Для Python — бібліотека redis-py або aioredis.
15. Що таке N+1 проблема в ORM і як її вирішити?
N+1 — коли ORM робить 1 запит для основної таблиці та N додаткових для зв'язаних об'єктів. Наприклад, отримали 100 постів → 100 запитів для авторів. Рішення: Django — select_related/prefetch_related; SQLAlchemy — joinedload/subqueryload/selectinload.
💡 Порада: Використовуйте django-debug-toolbar або логування SQL для виявлення. У SQLAlchemy — echo=True на engine. Це одне з найчастіших production-питань.
🧪 Тестування
16. Чим pytest відрізняється від unittest?
unittest — стандартна бібліотека, xUnit-стиль з класами та self.assert*(). pytest — простіший синтаксис (звичайні функції + assert), потужні фікстури, параметризація (@pytest.mark.parametrize), багатий ecosystem плагінів (pytest-cov, pytest-asyncio, pytest-django).
💡 Порада: У 2026 pytest — стандарт індустрії. Знайте фікстури, conftest.py, маркери. pytest сумісний з unittest-тестами — можна мігрувати поступово.
17. Що таке mocking і коли його використовувати?
Mocking — заміна реальних об'єктів на імітації для ізоляції тестів. Бібліотека unittest.mock: Mock, MagicMock, patch. Мокайте зовнішні залежності: API-виклики, БД, файлову систему, час. Ніколи не мокайте те, що тестуєте.
💡 Порада: Правило: patch там, де об'єкт використовується, а не де він визначений. Наприклад: @patch('myapp.views.requests.get'), а не @patch('requests.get').
18. Як тестувати Django views та API endpoints?
Django надає TestCase з self.client для HTTP-запитів. Для DRF — APIClient з rest_framework.test. Тестуйте: status codes, структуру відповіді, авторизацію, валідацію, edge cases. Використовуйте factory_boy або фікстури для тестових даних.
💡 Порада: Тестуйте як успішні сценарії (happy path), так і помилки (401, 403, 404, 422). Використовуйте @pytest.mark.django_db для доступу до БД у pytest.
⚡ Асинхронність
19. Як працює asyncio в Python? Що таке event loop?
asyncio — бібліотека для асинхронного I/O. Event loop — цикл подій, який керує виконанням корутин. async def визначає корутину, await — точку, де виконання може переключитись на іншу корутину. Це кооперативна багатозадачність — код «поступається» контролем явно.
💡 Порада: Знайте різницю між asyncio.gather() (паралельне виконання), asyncio.create_task() (фонова задача) та await (послідовне). Для HTTP — aiohttp або httpx.
20. Що таке Celery і коли його використовувати замість asyncio?
Celery — розподілена черга задач для важких/довготривалих операцій: відправка email, обробка зображень, генерація звітів, scheduled tasks (celery beat). Працює з брокером (Redis/RabbitMQ). asyncio — для конкурентного I/O в одному процесі. Celery — для розподіленого виконання між воркерами.
💡 Порада: asyncio для швидких I/O операцій у межах запиту. Celery — коли задача може тривати секунди/хвилини і не повинна блокувати відповідь користувачу. Часто використовують разом: FastAPI + Celery.
Готовий до Python-співбесіди?
Наш Telegram-бот задає реальні питання з Python, Django, Flask та алгоритмів. Адаптивна складність, миттєвий фідбек та детальний звіт після кожної сесії.
🚀 Почати тренуванняБезкоштовно · 5 інтерв'ю без оплати