Співбесіда з Python: питання і практика
Голосова мок-співбесіда для Python-розробників, які готуються до позицій junior, middle або senior. ШІ-інтерв’юер ставить питання на співбесіді Python, як у реальних командах: від мутабельності й генераторів до GIL, asyncio і типізації, а потім оцінює кожну відповідь за технічною точністю, повнотою і ясністю. Оберіть Python як технологію або завантажте резюме чи опис вакансії, щоб отримати питання під конкретну роль.
Що перевіряє співбесіда з Python
Модель даних і мутабельність
Змінні та незмінні типи, identity проти equality, хешованість і dunder-методи на кшталт __eq__, __hash__, __repr__. Очікуйте уточнень про мутабельні аргументи за замовчуванням і поверхневе та глибоке копіювання.
Ітератори та генератори
Протокол ітератора, ліниві обчислення через yield і генераторні вирази, yield from і коли генератор кращий за список у пам’яті.
Декоратори та контекстні менеджери
Замикання, декоратори з аргументами, functools.wraps, керування ресурсами через __enter__/__exit__ або contextlib.contextmanager.
Конкурентність, GIL і asyncio
Коли брати threading, multiprocessing чи asyncio, що насправді блокує GIL і що змінюють free-threaded збірки (експериментальні в 3.13, офіційно підтримуються з 3.14).
Керування пам’яттю
Підрахунок посилань, циклічний збирач сміття, типові причини витоків, __slots__ і профілювання пам’яті через tracemalloc.
Анотації типів
Дженерики з синтаксисом параметрів типів 3.12+, Protocol проти ABC, TypedDict і як вбудувати mypy або pyright у проєкт без зайвого тертя.
Інструменти, пакування і тести
pyproject.toml, віртуальні оточення, uv, ruff і lock-файли, а також фікстури pytest, параметризація і моки на правильній межі.
Django і FastAPI
Запити через ORM і проблема N+1 у Django, впровадження залежностей і валідація Pydantic у FastAPI, синхронна та асинхронна обробка запитів.
Питання на співбесіді Python за рівнями
Junior
Чим список відрізняється від кортежу і чому кортеж може бути ключем словника?
Що має бути в сильній відповіді:Список змінюваний, кортеж — ні, тому кортежі зручні для фіксованих записів. Ключ словника має бути хешованим, а кортеж хешований лише тоді, коли хешовані всі його елементи: (1, 2) підходить, а кортеж зі списком усередині — ні. Список не може бути ключем, бо його вміст, а отже й хеш, може змінитися.
Що не так із мутабельним аргументом за замовчуванням, наприклад def f(items=[])?
Що має бути в сильній відповіді:Значення за замовчуванням обчислюється один раз, під час визначення функції, тому всі виклики без аргументу ділять той самий список і зміни накопичуються. Стандартне рішення — None за замовчуванням і створення нового списку всередині функції. Сильна відповідь пояснює причину, а не лише обхідний шлях.
Яка різниця між is та ==?
Що має бути в сильній відповіді:== порівнює значення через __eq__, а is перевіряє, чи це той самий об’єкт. is використовують для синглтонів на кшталт None, == — для всього іншого. Варто згадати, що CPython кешує малі цілі числа та деякі рядки, тож is іноді «працює», але покладатися на це — баг.
Що означають *args і **kwargs у сигнатурі функції?
Що має бути в сильній відповіді:*args збирає зайві позиційні аргументи в кортеж, **kwargs — іменовані аргументи в словник. Ті самі оператори розпаковують послідовності та словники під час виклику. Плюс, якщо згадаєте keyword-only параметри після * і positional-only параметри до /.
Чим list comprehension відрізняється від генераторного виразу?
Що має бути в сильній відповіді:List comprehension одразу будує весь список у пам’яті, а генераторний вираз видає елементи ліниво, по одному. Генератор економить пам’ять на великих або нескінченних послідовностях, але пройти його можна лише раз. Список потрібен, коли треба індексація, довжина або кілька проходів.
Middle
Як працює декоратор і як написати декоратор з аргументами?
Що має бути в сильній відповіді:Декоратор — це callable, який приймає функцію й повертає заміну, зазвичай замикання-обгортку; @dec — це просто f = dec(f). Декоратор з аргументами — це фабрика: зовнішня функція приймає параметри й повертає сам декоратор. functools.wraps зберігає ім’я, docstring і метадані оригінальної функції.
Поясніть протокол ітератора і як його реалізують генератори.
Що має бути в сильній відповіді:Iterable має __iter__, що повертає ітератор; ітератор має __next__ і кидає StopIteration, коли елементи закінчились. Генераторна функція повертає об’єкт-генератор, який реалізує обидва методи й зберігає стан між yield. Згадайте yield from для делегування підгенератору і те, що цикл for під капотом викликає iter() і next().
Як працюють контекстні менеджери і коли варто писати власний?
Що має бути в сильній відповіді:with викликає __enter__ на вході та __exit__ на виході, навіть якщо виникло виключення; __exit__ отримує деталі виключення й може його придушити, повернувши True. contextlib.contextmanager дозволяє написати менеджер як генератор з одним yield у try/finally. Типові випадки — локи, транзакції, тимчасові файли, заміри часу.
Коли обрати threading, multiprocessing, а коли asyncio?
Що має бути в сильній відповіді:У стандартній збірці CPython GIL дозволяє виконувати байткод Python лише одному потоку за раз, тож потоки допомагають з I/O-задачами, але не з CPU-задачами. multiprocessing обходить GIL окремими процесами ціною пам’яті та серіалізації. asyncio обробляє багато I/O-задач в одному потоці, але потребує асинхронних бібліотек, а будь-який блокувальний виклик зупиняє весь event loop.
Як структурувати тести на pytest для коду, що звертається до зовнішнього API?
Що має бути в сильній відповіді:Сховайте API за невеликим клієнтом і мокайте саме цю межу, а не внутрішності сторонніх бібліотек. Фікстури — для підготовки й прибирання, parametrize — для граничних випадків без копіпасту, monkeypatch або unittest.mock — для клієнта. Кілька інтеграційних тестів проти sandbox або записаних відповідей ловлять зміни контракту.
Senior
Який стан GIL зараз і що змінює free-threaded Python?
Що має бути в сильній відповіді:PEP 703 додав опційну збірку без GIL: у 3.13 вона була експериментальною, у 3.14 стала офіційно підтримуваною, але не за замовчуванням. Вона дає паралельне виконання CPU-задач у потоках, проте однопотоковий код може бути дещо повільнішим, а C-розширення треба перезібрати й позначити сумісними, інакше GIL може ввімкнутися під час виконання. Сильна відповідь додає: прибирання GIL не робить ваш код потокобезпечним, спільний змінний стан усе одно потребує локів.
Як CPython керує пам’яттю і як шукати витік пам’яті?
Що має бути в сильній відповіді:Більшість об’єктів звільняється одразу завдяки підрахунку посилань, а циклічні посилання прибирає циклічний збирач сміття. На практиці витоки дають глобальні кеші, необмежений lru_cache, посилання в замиканнях чи підписниках, або C-розширення. Порівнюйте знімки tracemalloc у часі, використовуйте objgraph чи memray, а для великої кількості дрібних об’єктів — __slots__ або weakref.
Що таке дескриптори і як на них спираються property та методи?
Що має бути в сильній відповіді:Дескриптор — об’єкт з __get__ і, за потреби, __set__ або __delete__, що зберігається як атрибут класу. Data-дескриптори мають пріоритет над __dict__ екземпляра, non-data — ні, тому property перехоплює присвоєння, а звичайний метод можна затінити. Функції — це non-data дескриптори, і саме їхній __get__ створює зв’язані методи.
Як не блокувати event loop в asyncio-сервісі і як керувати життям задач?
Що має бути в сильній відповіді:Для I/O беріть асинхронні клієнти, а неминучу блокувальну чи CPU-важку роботу виносьте в asyncio.to_thread або пул процесів через run_in_executor. Для структурованої конкурентності використовуйте asyncio.TaskGroup (3.11+): помилка скасовує сусідні задачі, і нічого не залишається без нагляду. Коректно обробляйте скасування — прибирання у finally, не ковтати CancelledError, таймаути через asyncio.timeout.
Коли використати typing.Protocol замість абстрактного базового класу?
Що має бути в сильній відповіді:ABC — номінальна типізація: клас має явно успадкуватися, а абстрактні методи перевіряються під час створення екземпляра. Protocol — структурна типізація: будь-який клас з потрібними методами підходить для тайпчекера, що зручно для сторонніх типів і слабкого зв’язування. За замовчуванням Protocol перевіряється статично; runtime_checkable дає isinstance, але перевіряє лише наявність методів, не сигнатури.
Як проходить мок-співбесіда з Python
- Оберіть Python (та інші технології зі свого стеку), свій рівень і мову співбесіди: українську, англійську або російську. Або завантажте резюме й опис вакансії.
- Відповідайте на кожне запитання голосом, як на справжній співбесіді.
- Отримайте оцінку кожної відповіді за точністю, повнотою та зрозумілістю і звіт зі слабкими місцями.
Як відповідати на питання з Python уголос
- →Почніть з визначення в одне речення, потім поясніть механізм, потім дайте маленький приклад. Структуру оцінюють не менше, ніж факти.
- →Називайте версію Python, коли це важливо: порядок ключів dict (3.7+), match (3.10+), TaskGroup (3.11+), free-threaded збірки (3.13+). Це показує, що ви стежите за мовою.
- →Описуйте код словами, а не диктуйте синтаксис: «декоратор, який обгортає функцію й повторює виклик при помилці», а не кожну дужку й двокрапку.
- →Завжди називайте компроміс: потоки проти процесів, генератори проти списків, ABC проти Protocol. Сказати, коли ви б цього НЕ використали, — сильний сигнал.
- →Прив’язуйте відповіді до реальної роботи: витік, знайдений через tracemalloc, N+1 у Django, нестабільний тест, який ви полагодили. Конкретика сильніша за підручник.
Часті запитання
Чи треба писати код під час мок-співбесіди з Python?
Ні. Питання усні, ви відповідаєте голосом, редактора для live coding немає. Ви пояснюєте концепції, компроміси й підхід до задачі — так само, як на технічному скринінгу.
Чи можна тренувати Django або FastAPI разом із Python?
Так. Django і FastAPI можна обрати як технології разом із Python, і співбесіда поєднає питання по мові та по фреймворку. Також можна завантажити опис вакансії, щоб питання відповідали конкретній ролі.
Чи підійде це досвідченим Python-розробникам?
Так. Оберіть рівень senior, щоб отримати питання про GIL і free-threading, керування пам’яттю, дескриптори, асинхронну архітектуру й типізацію. Кожну відповідь оцінюють за технічною точністю, повнотою і ясністю.
Скільки це коштує?
Перша співбесіда до 5 питань безкоштовна. Далі — оплата за кожну співбесіду від $1.75, без підписки. В одній співбесіді може бути до 50 питань.